쿠키와 세션에 대해 공부한 내용을 정리한 글입니다.
먼저 쿠키에 대해서 정리합니다.
HTTP의 특성
쿠키와 세션을 이해하려면 먼저 HTTP의 특성을 알아야 한다.
- HTTP: 인터넷상에서 데이터를 주고 받기 위해 서버/클라이언트 모델을 따르는 통신규약
- 비연결성(Connectionless), 비상태성(Stateless)
- 서버와 클라이언트의 연결 상태를 유지하지 않고, 연결 해제 후 상태 정보를 저장하지 않음
- 서버의 자원을 절약하기 위함
- 요청마다 새로운 사용자로 인식하는 단점 (같은 사용자인지 식별이 어려움)
이러한 단점을 보완하여, 서버가 클라이언트를 식별하도록 돕기 위해 쿠키와 세션 사용
쿠키
“내가 가지고 있으면서 서버를 이용할 때마다 보여주는 것”
- 웹 사이트에 접속할 때 생성되는 정보를 담은 임시 텍스트 파일
- 서버가 사용자의 웹 브라우저에 저장하는 데이터
- 데이터 형태는 Key와 Value로 구성되고, String 형태로 이루어져 있다.
- 브라우저마다 저장되는 쿠키는 다르다.
서버에서는 브라우저가 다르면 다른 사용자로 인식한다.
사용목적
- 세션 관리(Session Management)
로그인, 닉네임, 접속 시간, 장바구니 등 서버가 알아야 할 정보들을 저장
- 개인화(Personalization)
사용자마다 다르게 그 사람에 적절한 페이지를 보여줄 수 있음 (사용자 정보 유지)
- 트래킹(Tracking)
사용자의 행동과 패턴을 분석하고 기록
종류
- Session Cookie
메모리에만 저장. 만료시간을 설정하지 않으면 브라우저 종료 시 삭제
- Persistent Cookie
파일로 저장. Max-Age 설정을 통해 장기간 유지 가능하다.
브라우저 종료와 관계없이 사용 가능.
- Secure Cookie
HTTPS에서 사용되는 암호화된 쿠키. 그러나 실질적 보안은 제공되지 않음.
- Third Party Cookie
다른 도메인에 요청이 필요할 때 생성하는 쿠키. 주로 광고 목적으로 사용됨.
쿠키의 사용 원리
- 클라이언트가 서버에 HTTP 요청
- 서버는 HTTP 응답 시 set-cookie를 통해 쿠키 생성하여 전달
- 클라이언트는 이제 HTTP 요청마다 헤더에 쿠키를 담아 전송
- 서버는 전송받은 쿠키와 서버에 저장된 사용자 정보를 비교하여 동일한 사용자임을 인식
- 만료 기간 이전이라면, 위와 같이 사용함
- 만료되었다면 서버에 새로 요청하여 쿠키를 새로 발급
옵션
- HttpOnly
브라우저에서 JS를 통해 쿠키 접근 불가능
- HTTP secure
HTTPS 통신 외에서는 쿠키를 전달하지 않는다.
- SameSite
크로스사이트 요청 시 전송 허용 여부 (None, Strict, Lax)
- Domain
쿠키에 대한 Domain 설정
설정한 도메인을 대상으로 한 요청에서만 쿠키가 전송됨
(기본값: 쿠키를 보낸 서버의 도메인)
장점
- 대부분의 브라우저가 지원
- 데이터 유효기간 지정 가능
- XSS로부터 안전 (httpOnly 옵션 설정 시)
단점
- 작은 데이터 저장 용량 (4KB)
- 서버에 HTTP 요청마다 전달되므로, 서버에 부담
- 암호화가 안 되어 있어 유저 정보 도난 위험
- 개인정보가 저장되므로 사생활 침해의 소지
(브라우저에는 쿠키 거부 기능이 있음)
- 문자열만 저장 가능
- CSRF 공격에는 취약
브라우저가 서버에 요청을 보낼 때 쿠키를 자동으로 포함해서 보낸다.
만약 그 쿠키에 세션ID, 액세스 토큰 등이 들어있다면 해커가 내 인증정보를 활용해서
서버에 나인 것처럼 위장해서 요청을 보낼 수 있다.