세션은 Stateless한 HTTP 프로토콜의 특성을 보완하기 위한 개념이다.
HTTP는 서버와 한번 요청-응답을 주고 받으면 주고 받은 정보를 유지하지 않는다. 그저 정보(요청)를 건네주고 원하는 정보(응답)를 받을 뿐이다. 때문에 한 사이트에 대한 인증 작업을 할 때 번거로움이 따를 수 있다. (매번 요청을 보낼때마다 인증작업을 수행해야하므로...)
따라서 한번 해당 사이트에 인증 작업을 수행한 후 세션으로 서버에서 해당 사용자가 인증되었다는 것을 유지하면 인증에 대한 상태를 계속 유지할 수 있게 된다.
쿠키와의 차이
쿠키도 마찬가지로 Stateless한 HTTP 프로토콜의 특성을 보완하기 위한 개념이다. 단, 세션과는 다음의 차이점이 존재한다.
- 저장 위치
쿠키는 정보를 클라이언트에 저장한다. 즉, 사용자의 디스크 내부에 정보를 저장한다.
참고: https://stackoverflow.com/questions/5700746/where-do-browsers-store-cookies
위 내용을 살펴보면 Firefox 브라우저는 cookies.txt로 C:\Documents and Settings\Windows login/user name\Application Data\Mozilla\Firefox\Profiles\profile folder다음 위치에 저장된다. Chrome의 경우도 C:\Documents and Settings\
반면 세션은 서버에 직접 저장한다. 때문에 클라이언트의 디스크에 저장하는 쿠키보다는 상대적으로 보안에 이점이 있다.
동작 방식
- 클라이언트가 서버로 첫 요청을 보낸다.
- 서버에서는 해당 요청에 session id가 없으므로 새로이 발급하여 응답을 보내준다. 이때, 보통은 쿠키에 session id를 담아서 전달한다.
- 이후 클라이언트는 전달받은 session id 값을 매 요청마다 쿠키에 담아 서버에 전달한다.
- 서버에서는 이 session id 쿠키로 사용자를 판단한다.
- 만약 클라이언트가 인증 작업을 수행하면 새로운 사용자로 판단하고 사용자 정보를 갱신, 새로운 session id를 발급한다.
- 클라이언트가 종료하면 세션을 제거한다.
세션을 사용하는데 쿠키가 반드시 필요한가?
결론부터 말하면 그렇다이다. 세션은 브라우저마다 하나씩 생성된다. 각 브라우저에서 사용한 정보를 세션에서 가지고 각 유저에 맞게 서비스를 해준다. 이때 이전에 저장한 세션의 정보를 사용하기 위해서는 해당 클라이언트의 세션 id를 알아야한다. 이를 위해 쿠키에 세션 id를 저장하는 방식으로 해당 클라이언트에서 사용한 세션을 사용할 수 있다.