로그인 상태 유지 원리


Stateless한 HTTP 통신에서 로그인 유지는 어떻게 가능할까?


로그인 후 로그인 상태를 유지하기 위해서는 쿠키와 세션이 필요한데, 그 이유는 HTTP 프로토콜의 특성 때문이다. HTTP 프로토콜은 비연결성(Connectless)을 특성으로 갖는데, 이는 클라이언트의 요청에 대한 응답 이후 클라이언트와의 관계를 끊어버리는 것을 의미한다. 서버와 클라이언트 간의 관계를 끊어버리기 때문에 서버는 클라이언트의 상태를 알 수 없으며 이전에 했던 요청 정보도 알 수 없다. 이를 무상태(Stateless) 특성이라고 말한다.
그러나 로그인 상태를 유지한다는 것은 이전의 정보를 기억하는 것을 의미하므로 HTTP 통신만으로는 구현이 불가능하다.

쿠키와 세션을 사용하여 HTTP 통신 과정에서 클라이언트와 서버 간의 정보를 공유하고 기억하는 것을 가능하게 한다.

동작 원리는 다음과 같다.

  1. 로그인을 시도한 사용자가 유효한 사용자인 경우, 응답 헤더의 Set-Cookie에 유저를 식별할 수 있는 세션 아이디 값을 포함하여 응답한다.
    사용자 입력한 아이디와 패스워드를 확인하여 우리 사이트의 사용자인지 확인한다. 회원이 아니라면, 권한이 없다는 401응답 등과 함께 로그인을 실패한다. 그리고 회원이라면, 헤더의 Set-Cookie 필드에 유저를 식별할 수 있는 세션 아이디 값을 포함하여 응답하고 서버에는 해당 세션 아이디 값을 저장한다.


  2. 클라이언트는 이후 요청부터 현재 브라우저에 저장된 모든 쿠키 값을 Cookie에 포함하여 요청하게 된다.
    로그인에 성공하여 Set-Cookie가 포함된 헤더를 응답받은 클라이언트는 해당 값을 브라우저의 쿠키에 저장한다. 그리고 페이지 이동하여 재 요청하게 되는 경우, 브라우저의 쿠키롤 포함하여 요청한다. 이 때 브라우저 쿠키는 헤더의 Cookie 값에 포함된다.


  1. 서버는 클라이언트 요청 헤더에 포함된 세션 아이디 값을 확인하여 사용자를 식별하고 새로운 세션 아이디 값을 발급하여 응답한다.
    클라이언트 요청 헤더의 쿠키 값에 세션 아이디를 서버의 세션 값과 비교하여 유효한 값인지 확인한다. 해당 세션 아이디가 유효하다면, 사용자가 요청한 값과 함께 새로운 세션 아이디를 발급하여 응답한다. 이처럼 주고 받는 세션 아이디를 통해 해당 사용자의 로그인 상태를 계속 유지할 수 있게 된다.

  1. 클라이언트 종료 시 브라우저의 세션 아이디가 제거되며, 서버에서 세션도 제거 된다.
    클라이언트 종료 시, 다시 말해 브라우저 종료하거나 로그아웃 시 브라우저의 세션 아이디는 제거되며 서버에서 세션도 제거된다.

Comments