세션(Session)과 쿠키(Cookie)
세션이란?
세션 정보가 웹 서버에 저장되며 상태를 유지하는 기술이다.
세션의 동작 순서
1. 클라이언트가 페이지에 요청한다. (사용자가 웹사이트에 접근)
2. 서버는 접근한 클라이언트의 Request-Header 필드의 Cookie를 확인해, 클라이언트가 해당 session-id를 보냈는지 확인한다.
3. session-id가 존재하지 않는다면 서버는 session-id를 생성해 클라이언트에게 돌려주며 쿠키에도 session-id를 저장해 돌려준다
4. 클라이언트는 재접속 시, 해당 쿠키를 이용해 session-id 값을 서버에 전달한다.
ex) 화면을 이동해도 로그인이 풀리지 않고 유지되는 사례
그렇다면 세션은 어떤 방식으로 어떻게 저장되는 걸까?
보통 session-id의 경우 Inmemory-DB인 redis에 저장해 사용한다고 한다.
그 이유는 session-id를 DB에 저장하게 되면 매 요청마다 DB에 session값을 항상 가져와야 하기 때문에 작업이 무겁기 때문이다.
여러 대의 서버가 존재하는 환경에서 session-id를 유지하는 방법으로는 크게 3가지 방법이 있다.
첫 번째는, Sticky session인데 해당 방법에 대해 설명하자면 WAS 서버가 1번부터 4번까지 다중 서버로 구성된 환경이 있다고 하자.
사용자가 WAS 1번을 통해 로그인을 한다면 해당 WAS 1번을 그대로 쭉 사용하게 되는 것이다.
해당 방법의 단점으로는 한 서버에 트래픽이 몰릴 수 있다는 점이 있다.
두 번째는, 세션 클러스터링 방법인데 사용자가 WAS 1번에 로그인을 하고 사용하게 되면 세션을 복제하는 것이다.
이 방법은 세션 저장소에 저장될 때마다 모든 서버에 입력해야 하므로 트래픽 증가로 인해 서버수가 증가할 때 성능 저하가 발생한다는 단점이 있다.
세 번째는, Inmemory DB 사용이다.
이는 기존 서버가 갖고 있는 세션 저장소를 이용하는 것이 아니라, 별도의 세션 저장소를 사용하여 세션 스토리지를 분리하는 것이다.
보통 메모리 접근이 디스크 접근보다 빠르며 데이터를 조회할 때 검색 시간이 줄어들기 때문에 해당 방법을 사용한다.
위와 같이 세션 스토리지가 분리되면 서버가 아무리 늘어난다고 할 지라도 세션 스토리지에 대한 정보만 각각의 서버에 입력해주면
세션을 공유할 수 있게 된다.
보통 Inmemory-DB로 Redis나 Memcached를 사용하게 된다. Redis와 Memcached에 대한 비교는 추후 포스팅에서 할 예정이다.
쿠키란?
사용자의 PC에 저장하는 작은 기록 정보 파일이다. 클라이언트의 상태 정보를 PC에 저장했다가 필요시 정보를 참조하거나 재사용할 수 있다.
쿠키와 세션의 차이
- 쿠키와 세션은 비슷한 역할을 하며, 동작 원리도 비슷하다. 그 이유는 세션도 결국 쿠키를 사용하기 때문이다.
큰 차이점은 사용자의 정보가 저장되는 위치이다. 쿠키는 서버의 자원을 전혀 사용하지 않으며, 세션은 서버의 자원을 사용한다.
- 보안 면에서 세션이 더 우수하며, 쿠키는 클라이언트에 저장되기 때문에 변질되거나 request에서 스니핑 당할 우려가 있어서 보안에 취약하지만 세션은 쿠키를 이용해서 session-id만 저장하고 그것으로 구분하여 서버에서 처리하기 때문에 비교적 보안성이 높다.
- 라이프 사이클은 쿠키도 만료기간이 있지만 파일로 저장되기 때문에 브라우저를 종료해도 정보가 유지될 수 있다. 또한 만료기간을 따로 지정해 쿠키를 삭제할 때까지 유지할 수도 있다. 반면에 세션도 만료기간을 정할 수 있지만, 브라우저가 종료되면 만료기간에 상관없이 삭제된다.
- 속도 면에서 쿠키가 더 우수하며, 쿠키는 클라이언트에 정보가 있기 때문에 서버에 요청 시 속도가 빠르고
세션은 정보가 서버에 있기 때문에 처리가 요구되어 비교적 느린 속도를 낸다.