보통 쿠키와 세션을 대립되는 개념으로 많이들 알고있다. (나도 그랬었다.)
쿠키는 클라이언트에 저장 / 세션은 서버에 저장.. 그렇기 때문에 쿠키는 보안에 취약하다.. 등등
하지만 쿠키와 세션을 대립되는 개념으로만 이해하면 세션을 이해할 수 없다.
HTTP 프로토콜
HTTP는 HTML 문서와 같이 리소스들을 가져올 수 있도록 해주는 프로토콜이다.
HTTP는 상태를 저장하지 않는다.(Sateless) 동일한 연결 상에서 연속하여 전달된 두 개의 요청(request) 사이에는 연결고리가 없다. 이는 로그인처럼 클라이언트와 서버가 계속해서 상호작용하려고 할때 문제가 된다. 이를 보완하기 위해 HTTP 쿠키가 사용된다. 쿠키는 서버에서 Set-Cookie 헤더를 이용해 클라이언트에 저장할 수 있고, 모든 HTTP 요청시 서버에 전달되는 특징이 있다. 이를 이용하여 클라이언트와 서버의 세션을 유지시켜주는 것이다. 쿠키에 sessionID 를 저장해놓고 서버는 매 HTTP 요청마다 이 sessionID를 이용하여 해당 id로 세션이 존재하는지 체크하여 클라이언트와 서버의 연결고리르 맺어준다.
운영중 세션 이슈
프로젝트 운영 중 고객이 결제를 하면 결제하면서 입력한 주소로 회원의 회원정보 주소를 업데이트 해주는 로직이 있었다. 세션에서 회원번호를 가져와 회원정보를 업데이트하는 로직이였는데, 이 세션에서 회원번호를 찾지 못해서 에러가 나고 있었던 것이다. 내가 맡은 모듈의 문제가 아니였지만 동료가 해결하지 못하고 있어서 같이 보았던 적이 있다.
너무 당연하게도 세션을 찾지 못하는 이유는 쿠키가 없기 때문이었다. 세션은 쿠키의 값을 이용해서 유지되는 걸 알고 있었기 때문에 단번에 알아차릴 수 있었다. PG사에서 결제완료 callback을 주면 PG사의 request를 받아서 바로 결제완료 로직과 회원정보 업데이트 로직을 수행하고 있었다. 보통의 쿠키는 보안때문에 명시한 도메인과 동일한 곳에서만 전송이 된다. 그렇기 때문에 PG사에서 주는 callback request에는 쿠키가 없었고 당연히 쿠키가 없으니 세션을 찾지 못했던 것이다.
참조