관리 메뉴

공부한것들을 정리하는 블로그 입니다.

면접 예상 질문 및 답변 본문

잡담/개발자로서 공부

면접 예상 질문 및 답변

호 두 2019. 11. 28. 09:20
반응형

 

2019.11.28

 

면접 예상 질문 및 답변

 

 


Q. 세션과 쿠키의 차이점은?

 

A. 세션은 서버에 저장되는 값이며, 쿠키는 클라이언트에 저장되는 값입니다.

 

 

 

 

Q. 본인이 만든 프로젝트는 톰캣을 내렸다가 올리면 로그인이 풀리지 않나요?
톰캣을 내렸다가 올려도 로그인이 풀리지 않으려면 어떻게 해야할까요?

 

A. 톰캣은 설정으로 세션을 유지시키는 방법이 가능하다. 톰캣의 설정파일(server.xml)에 관련설정(saveOnRestart)을 추가함으로써 세션을 유지시킬 수 있다. 따라서 서버 재구동시마다 세션 정보를 저장히지 않도록 처리 할 수 있다.

 

(참고)

* 이는 톰캣이 StandardManager를 사용하기 때문에 톰캣을 중지하는 시점에 세션 정보를 파일로 저장하기 때문이다. 별도의 pathname을 지정하지 않으면 SESSIONS.ser 라는 파일로 생성된다. 그리고 다시 톰캣이 기동하면 SESSIONS.ser 파일에 저장된 내용이 메모리에 올려지며 SESSIONS.ser 파일은 삭제된다.

다만 유의할 점은 StandardManager의 세션 저장 기능을 사용 할 때 반드시 shutdown.sh 등 정상적인 방법으로 중지해야만 세션 정보가 파일로 저장된다는 것이다. 만일 유닉스 계열 머신에서 kill -9 를 이용하여 강제 종료시킬 경우 세션 정보가 파일로 저장되지 않는다.

때에 따라서 이러한 세션 저장 기능을 사용하고 싶지 않을때는(ex) 톰캣을 재기동 한다거나 혹은 굳이 기존 세션을 되살리지 않아도 되는 경우) 스크립트를 이용하여 기동시 work 디렉토리 내 SESSIONS.ser 파일을 삭제해도 되고, 아니면 conf/context.xml 에 pathname=""으로 설정하여 세션 정보 파일 생성을 막으면 된다.

 

(참고2)

일반적인 서버라면 서버를 여러개 사용하여 해당 문제를 해결 할 수있다. 특히 세션(로그인 인증 정보)만을 담당하는 서버를 구성하는 방법이 있는데, 그것이 바로 로그인 통합관리(SSO) 이다. 해당 시스템을 별도로 구성해 놓고, 각각의 업무 시스템들이 다운되어도 로그인 인증 정보는 해당 SSO 서버에 남아 있기 때문에 해당 정보로의 인증 처리가 가능하다. 다만 업무서버도 죽고, 브라우져 쿠키도 날아가면 이 경우에는 답이 없다.

 

 


Q. [ String user = httpSession.getAttribute("user"); ]
여기서 session의 값을 가져오는 key는 "user"입니다. 
사용자 A가 접속해도 "user"로 값을 가져오고, 사용자 B가 접속해도 "user"로 가져오는데 어떻게 A와 B가 접속했을때 서로 다른 결과값을 받을수 있나요? 

 

A. was에서 세션 구분이 이루어졌기에 키값이같더라도 사용자 구분이 가능하다.

 

세션은 쿠키를 이용한다. 어떤 웹 브라우저가 서버에 요청을 하면 서버는 세션 아이디를 할당해서 응답할 때 함께 전달한다. 웹 브라우저는 이 세션 아이디를 쿠키에 저장해두고 매 요청마다 세션 아이디를 함께 전달한다. 서버는 세션 아이디를 바탕으로 사용자를 식별하고 사용자의 데이터를 서버에 저장하여 관리한다.

 

로그인 요청이 들어왔을 때, 로그인정보가 일치하면, 서버는 세션을 생성한다. 세션에는 사용자ID, 로그인시간, IP 등을 저장한다. 클라이언트에 응답할 때, 세션을 찾을 수 있는 세션ID를 클라이언트에 전달한다.(보통 쿠키로 전달) 클라이언트는 다음 요청시, 세션ID를 함께 요청(쿠키를 사용하든 다른 방법을 사용하든)한다. 서버는 이 세션ID를 이용해서 서버에 저장된 세션을 찾아온다. 서버 애플리케이션은 이 세션에 저장된 정보를 읽어, 누가 로그인했는지 확인할 수 있다.

 

 

 

Q. 세션은 서버에 저장되고, 쿠키는 클라이언트에 저장된다고 하셨는데, 그럼 쿠키가 안되는 상황에서도 세션은 사용할 수 있나요?

 

A. 몇가지 설정을 통해서 세션을 사용 할 수 있다. 

 

세션은 쿠키를 이용한다. 어떤 웹 브라우저가 서버에 요청을 하면 서버는 세션 아이디를 할당해서 응답할 때 함께 전달한다. 웹 브라우저는 이 세션 아이디를 쿠키에 저장해두고 매 요청마다 세션 아이디를 함께 전달한다. 서버는 세션 아이디를 바탕으로 사용자를 식별하고 사용자의 데이터를 서버에 저장하여 관리한다.

 

서버에서는 저장된 세션과 클라이언트를 매칭하기 위해서 세션 식별정보를 클라이언트에 남겨둬야 한다. 이때 세션식별자를 쿠키로 저장하는 것이 보편적이다. (쿠키에 세션 식별자를 저장하는 경우, 식별자로 클라이언트를 유추하거나 특정할 수 없게해야만 안전하다. 또한 중복되지 않아야 한다.)

세션/쿠키를 이용해서 클라이언트를 식별할 수 있는 것이지, 세션/쿠키가 클라이언트를 식별해 주는것은 아니다. 따라서 쿠키가 안되는 상황에서 세션을 사용하려면, 세션식별자로 쿠키가 아닌 다른 값을 이용하도록 따로 설정해줘야 한다.

 

(참고) - (휘발성 데이터로 쿠키를 대신하는 경우)

* was설정에 따라 세션정보를 url에 담을 수 있다. 예를들어 SPA형태로 개발할 때 로그인 인증값을 저장할 수 있는 변수를 만들어서 로그인 인증 토큰을 저장시키는 방법을 사용해볼 수 있다. 시스템 메모리에 저장되다 보니 쿠키와 관계없이 잘 작동된다. 다만 근본적인 문제해결은 되지 못하는게, 다른 탭에선 로그인이 전혀유지 될 수 없고 새로고침하는 순간 로그인 다시 해야하기 때문이다. 

 

 

 

 

(참고)

(쿠키를 이용했을 때 동작과정)

(쿠키를 이용했을 때 동작과정 )

 

(세션을 이용했을 때 동작과정)

 

 

 

 

 

쿠키/세션의 목적

  • 연결이 지속적이지 않은 HTTP 환경에서, 이전 연결에서 발생한 결과를 다음 연결에서 사용하기 위한 방법으로 고안된 것입니다.
  • 예를 들면
    • 이전 연결에서 요청한 어떤 계산 결과를 다음 요청해서 사용해야 한다거나,
    • "오늘 하루동안 팝업 열지 않기"를 눌렀는데, 서버에서 이를 인식하고 다음 연결에서 팝업되지 않게 하려고 할 때가 되겠습니다.
    • 마지막에 검색했던 검색어를 입력창에 유지하려고 하는 경우 등

 

용용: 쿠키를 이용한 클라이언트의 식별

  • 쿠키를 이용해서 클라이언트를 식별할 수 있는 것이지, 쿠키가 클라이언트를 식별해주는 것은 아닙니다.
  • 즉, 아래 그림에서 "식별정보"라는 말이 잘못된 것이라고 보면됩니다.

쿠키를 사용하여 클라이언트를 식별하는 방법의 한 예로는

  • 사용자ID, 로그인시간, IP등을 암호화한 구문을 클라이언트의 쿠키에 키이름=암호화된구문으로 저장합니다. (예: state=ASKHDNxxu7432keedsa7jhklsadasdmslk )
  • 위 쿠키는 서버에서 생성하여 클라이언트에게 쿠키에 저장하라고 응답합니다.(응답헤더)
  • 이제 클라이언트는 매번 서버에 요청할 때 위 쿠키를 전달합니다.
  • 서버는 로그인상황을 검사하기 위해서 매번 쿠키를 읽습니다. 그리고 위의 키를 찾아, 정보를 해독하고, 서버에 있는 사용자 정보와 비교하여, 일치하면, 로그인된 것으로 보고, 일치하지 않으면, 불량요청 혹은 로그인하지 않은 사용자로 판별하면 됩니다.

 

응용: 세션을 이용한 클라이언트의 식별

  • 세션도 쿠키와 동일하게 세션을 이용해서 클라리언트를 식별할 수 있는 것입니다. 세션이 클라이언트를 식별해주는 것은 아닙니다.

  • 로그인 요청이 들어왔을 때, 로그인정보가 일치하면, 서버는 세션을 생성합니다.

  • 세션에는 사용자ID, 로그인시간, IP 등을 저장합니다.

  • 클라이언트에 응답할 때, 세션을 찾을 수 있는 세션ID를 클라이언트에 전달합니다.(보통 쿠키로 전달)

  • 클라이언트는 다음 요청시, 세션ID를 함께 요청(쿠키를 사용하든 다른 방법을 사용하든)합니다.

  • 서버는 이 세션ID를 이용해서 서버에 저장된 세션을 찾아옵니다.

  • 서버 애플리케이션은 이 세션에 저장된 정보를 읽어, 누가 로그인했는지 확인할 수 있습니다.

 

 

(참고)

* 질문을 고민하기전에 가장 먼저 ‘왜’ 쿠키와 세션이라는 개념이 필요한지 살펴보는 것이 중요할 것 같다.

세션과 쿠키는 네트워크 망에서 서버와 클라이언트가 상호간 통신을 할 때 사용하는 수단을 말한다. 이 기술들의 목적은 “상태 유지” 에 있다. 웹 환경에서 사용되는 HTTP 프로토콜은 서버와 클라이언트가 통신을 완료하면 연결을 끊어버린다.

한번의 통신에 요청과 응답을 하나로 묶고 연결을 끊어버리는 프로토콜을 무상태 프로토콜 (Stateless Protocol) 이라고 한다.

그러면 이 무상태 프로토콜이 필요한 이유는 무엇일까?

무상태 프로토콜의 가장 큰 장점은 통신을 하면서 발생하는 수많은 리소스를 절약할 수 있다는 것이다. 무상태 프로토콜의 가장 대표적인 프로토콜은 HTTP이며, 주 목적은 웹 상에서 HTML 문서를 서빙하는 것이다.

세션과 쿠키는 하는일과 목적은 같지만 저장하는 방법에 따라 둘을 구분 짓는다. 쿠키는 클라이언(사용자) 로에 저장(보관), 세션은 서버에 저장하므로,

쿠키는 사용자의 민감한 정보를 다루는 것은 매우 위험하고, 쇼핑몰로 예로들면 장바구니에 담는 사용자 쇼핑 기록 정도를 저장시 쿠키를 활용한다라고 말한다.

 

 

 

반응형
Comments