🥖 쿠키와 세션
쿠키와 세션을 사용하는 이유는 비연결지향, 상태없음이라는 HTTP 프로토콜의 두가지 특성에 기반하고 있다.
비연결지향 Connectionless
HTTP 환경에서 클라이언트가 요청 메세지를 보내면 서버는 적절한 응답을 보내고 연결을 끊어버린다.
HTTP1.1 버전에서는 헤더에 keep-alive 옵션을 두고 커넥션을 계속 유지해 요청에 재활용하는 기능이 추가되었다.
그러나 아직까지는 비연결지향적 특성으로 커넥션 관리에 대한 비용을 줄이는 것을 효율적으로 보는 시각이 많다.
상태없음 Stateless
커넥션을 끊는 순간 클라이언트와 서버의 통신은 끝나며, 이 상태정보는 유지되지 않는다.
클라이언트와의 첫 통신에서 데이터를 주고받았다고 해도, 그 다음 통신에서 그 데이터는 유지되지 않는 것이다.
커넥션을 유지하지 않아 서버 리소스 낭비를 줄이는 것은 큰 장점이지만 번거로움을 낳기도 한다.
비연결지향 환경의 사이트에서는 로그인을 해도 페이지를 이동하면 통신이 끊겨 로그인이 풀릴 것이다.
매 통신시마다 새로운 커넥션을 만들어야 하므로 사용자는 인증 상태 유지를 위해 매번 로그인을 다시하는 등 복잡한 절차를 거치게 된다.
이러한 문제점을 보완하기 위해 등장한 개념이 바로 쿠키와 세션이다.
🍪 쿠키 Cookie
HTTP의 일종으로 클라이언트 로컬에 저장되는 작은 데이터 파일
클라이언트가 웹사이트에 접속할 때 그 상태 정보를 브라우저의 쿠키 저장소에 저장했다가 필요한 경우 정보를 참조한다.
내 블로그에서 다크모드와 라이트모드를 선택하고 요청을 반복해도 테마가 유지되는 것은 쿠키를 사용했기 때문이다😉
쿠키는 키와 값, 경로 정보, 인증시간으로 구성되어 있다.
사용자 인증이 유효한 시간을 명시할 수 있으며, 브라우저가 종료되어도 그 시간동안은 인증이 유지된다.
최대 4KB의 파일로 도메인 당 20개, 클라이언트 당 300개의 쿠키를 저장할 수 있다.
동작 순서
- 클라이언트가 처음 사이트에 방문해 서버에 페이지 요청을 보낸다.
- 웹 서버는 쿠키를 생성하고 정보를 담아 응답 메세지를 보낼 때 함께 클라이언트에 돌려준다.
- 클라이언트는 넘겨받은 쿠키를 쿠키 저장소에 저장한다.
- 클라이언트는 동일 서버에 다시 요청을 보낼 때 PC에 쿠키가 있는지 확인한다.
- 쿠키가 있는 경우 쿠키를 헤더에 담아 요청 메세지와 함께 전송한다.
🥐 세션 Session
웹 서버에 저장되는 쿠키
일정 시간동안 한 사용자로부터 들어오는 일련의 요청을 하나의 상태로 보고 이 상태를 유지시키는 기술이다.
한 클라이언트가 웹 서버에 접속을 유지하고 있는 동안을 세션이라는 하나의 단위로 보고 유지시키는 것이다.
사이트에서 로그아웃하기 전까지 로그인 상태가 유지되는 것은 세션 덕분이다.
세션은 기본적으로 브라우저를 종료할 때까지 유지되지만, 일정시간 동안 응답이 없으면 연결이 끊기게 설정할 수도 있다.
세션 ID
클라이언트를 구분하기 위해 서버에서 부여하는 고유한 키값
세션은 쿠키 기반으로 키와 값을 통해 정보를 저장하지만 저장 위치에 차이가 있다.
서버로부터 부여받은 세션 ID를 브라우저 쿠키 저장소에 저장하고, 클라이언트와 관련된 중요한 정보는 세션 저장소에 저장해 서버에서 관리한다.
🤔 세션 ID는 key일까, value일까?
웹 서버의 세션 저장소에서 세션 ID는 클라이언트 정보와 연결하기 위한 key로 존재한다.
그러나 서버로부터 전달받아 브라우저 쿠키 저장소에 저장될 때에는 value로 존재한다.
동작 방식
- 클라이언트가 서버에 페이지 요청을 보낸다.
- 서버는 요청메세지 헤더에 쿠키를 확인해 클라이언트가 세션 ID를 보냈는지 확인한다.
- 세션 ID가 존재하지 않으면 서버는 세션 ID를 생성해 클라이언트에 넘겨준다.
- 클라이언트는 서버로부터 받은 세션 ID를 쿠키로 저장해 로컬에 가지고 있는다.
- 클라이언트는 동일 서버에 다시 요청을 보낼 때 세션 ID가 담긴 쿠키를 함께 전송한다.
- 서버는 전달받은 세션 ID로 서버에 저장된 클라이언트 정보를 사용해 요청을 처리하고 응답한다.
👊 쿠키 vs 세션
가장 큰 차이점은 정보를 저장하는 위치이다.
쿠키는 키와 값을 모두 로컬에 저장하는데 브라우저에서 정보를 필요로 할 때 바로 접근할 수 있어 속도가 빠르다.
그러나 문제는 쿠키가 탈취당했을 때인데, 비밀번호나 신용카드처럼 중요한 개인정보라면 보안상에 큰 문제가 생긴다.
반면 세션은 추적 불가능한 세션 ID만을 로컬에 남겨두고 중요한 데이터는 서버에 저장해 비교적 안전하다.
그러나 사용자가 많아질수록 서버 메모리를 많이 차지하게 되므로 서버에 과부하를 주어 성능 저하의 요인이 된다.
또한 정보를 가져올 때 서버를 거쳐야 하기 때문에 로컬에서 곧바로 정보를 가져오는 쿠키에 비해 속도가 느리다.