쿠키와 세션을 사용하는 이유
먼저 HTTP 프로토콜에 대해 알아보자.
HTTP는 클라이언트와 서버 사이에 데이터를 주고 받기 위한 프로토콜이다.
HTTP 프로토콜은 다음과 같은 특징이 있는데,
- Connectionless (비연결성) : 클라이언트가 서버에 요청을 한 후 응답을 받으면 그 연결을 끊어버리는 특성
- Stateless (무상태성) : 통신이 끝나면 상태 정보를 유지하지 않는 특성
즉, 서버와 클라이언트가 한 번 통신을 마치고 끊어지면 이전 데이터를 유지하지 않는다.
이처럼 데이터가 유지되지 않는다면 서버는 매 요청마다 클라이언트가 누구인지 인증해야 한다.
(예를 들어, 페이지를 이동할 때마다 로그인을 다시 해야하는 등의 문제가 발생할 수 있다.)
이러한 과정은 매우 번거롭고 비효율적인데, 쿠키와 세션을 사용하여 이를 해결할 수 있다.
쿠키(Cookie)
쿠키(Cookie)란 클라이언트 로컬(브라우저)에 저장하는 작은 데이터 파일이다.
HTTP에서 클라이언트의 상태 정보를 로컬에 저장하였다가 필요시 참조하는 것이다.
(e.g. 팝업창의 '오늘 다시 보지 않음', 로그인 정보 저장, 장바구니 기능 등)
쿠키 특징
- 사용자 인증이 유효한 시간을 명시할 수 있다. (쿠키 만료 이전엔 브라우저가 종료되어도 상태 정보 유지)
- 클라이언트에 300개까지 쿠키를 저장할 수 있다.
- 하나의 도메인당 20개의 쿠키를 가질 수 있다.
- 하나의 쿠키는 4KB까지 저장 가능하다.
쿠키 구성 요소
- 이름 : 각각의 쿠키를 구별하기 위한 이름
- 값 : 쿠키 이름과 관련된 값
- 유효시간 : 쿠키 유지 시간
- 도메인 : 쿠키를 전송할 도메인
- 경로 : 쿠키를 전송할 요청 경로
쿠키 동작 방식
- 클라이언트가 웹 서버에 페이지를 요청한다.
- 웹 서버에서 쿠키를 생성한다.
- 생성한 쿠키에 정보를 담아 HTTP 헤더에 포함시킨 후 클라이언트에게 응답한다.
- 넘겨받은 쿠키는 클라이언트가 가지고 있다가(로컬 PC 저장) 서버에 요청시 헤더에 쿠키를 담아 요청한다.
- 사이트 재방문 시 로컬 PC에 해당 쿠키가 있는 경우 요청 페이지와 함께 쿠키를 전송한다.
세션(Session)
세션(Session)은 일정 시간 동안 같은 사용자로부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 유지시키는 기술이다.
쿠키를 기반하고 있지만, 사용자 정보를 클라이언트(브라우저)에 저장하는 쿠키와 달리 세션은 서버 측에서 관리한다는 점에서 차이가 있다.
(e.g. 세션 만료 전까지 로그인 유지)
세션 특징
- 클라이언트를 구분하기 위해 각 클라이언트에게 고유한 세션 ID를 부여한다.
- 클라이언트는 세션 ID를 쿠키로 저장한다.
- 사용자에 대한 정보를 서버에 두기 때문에 쿠키에 비해 보안이 좋다.
- 사용자가 많아질수록 서버 메모리를 많이 차지한다. (동접자 수가 많을 경우 서버에 과부하 발생 및 성능 저하의 요인이 됨)
세션 동작 방식
- 클라이언트가 페이지를 요청한다.
- 서버는 클라이언트 요청 헤더의 Cookie 필드를 확인하여 해당 세션 ID를 확인한다.
- 세션 ID가 존재하지 않을 경우, 서버는 세션 ID를 생성해 클라이언트에게 전달한다.
- 클라이언트는 서버로부터 받은 세션 ID를 쿠키에 저장한다.
- 클라이언트가 서버에 요청시 쿠키의 세션 ID를 같이 전달한다.
- 서버는 전달받은 세션 ID로 클라이언트 정보를 사용해 요청을 처리하고 응답한다.
쿠키와 세션의 차이
쿠키와 세션은 역할도 동작 원리도 비슷하다. (세션도 결국 쿠키를 사용하기 때문에)
가장 큰 차이점은 사용자 정보가 저장되는 위치(쿠키-클라이언트 로컬, 세션-서버)인데,
이로 인해 보안과 속도 측면에서 차이가 존재한다.
쿠키는 1. 빠른 속도 2. 보안에 취약 3. 서버 자원을 필요로 하지 않음 과 같은 특징이 있고,
반대로 세션은 1. 높은 보안성 2. 비교적 느린 속도 3. 사용자 수만큼 서버 메모리 차지 라는 특징을 갖는다.
라이프 사이클에도 차이가 있다.
쿠키는 (만료 시간이 있지만) 파일로 저장되기 때문에 브라우저를 종료해도 정보가 유지될 수 있고,
세션은 브라우저가 종료되면 만료 기간에 상관없이 삭제된다.
(e.g. 같은 브라우저의 다른 탭을 사용하면 세션을 공유하지만, 다른 브라우저를 사용하면 다른 세션을 사용함)
속도, 보안, 자원, 라이프 사이클 측면에서 차이가 있기 때문에 적절히 고려하여 쿠키와 세션을 병행 사용한다.
참고 자료
https://interconnection.tistory.com/74
https://hec-ker.tistory.com/368
https://dev-coco.tistory.com/61