HTTP는 요청 사이의 로그인 상태를 자체적으로 기억하지 않습니다. 쿠키는 브라우저에 값을 저장하고 요청에 실어 보내는 수단, 서버 세션은 서버에서 사용자 상태를 관리하는 방식입니다. 둘은 함께 사용하는 경우가 많습니다.
쿠키
서버는 응답의 Set-Cookie 헤더로 브라우저에 쿠키 저장을 요청합니다. 브라우저는 이후 요청의 주소와 쿠키 속성, 보안 정책에 맞는 쿠키를 Cookie 헤더에 포함합니다.
Set-Cookie: sessionId=random-session-id; Path=/; Secure; HttpOnly; SameSite=Lax
Secure: HTTPS 요청으로 전송하도록 제한합니다.HttpOnly: JavaScript의document.cookie에서 읽거나 변경하지 못하게 합니다.SameSite: 교차 사이트 요청에 쿠키를 포함할 조건을 제한합니다.Max-Age또는Expires: 브라우저에서 유지할 기간을 지정합니다.
속성이 없다고 모든 사이트로 전송되는 것은 아닙니다. 도메인, 경로 등 전송 범위가 적용됩니다. 저장 용량과 개수 제한도 브라우저 구현에 따라 달라집니다.
서버 세션
일반적인 세션 로그인은 다음 순서로 동작합니다.
- 서버가 로그인 정보를 검증합니다.
- 추측하기 어려운 세션 ID를 만들고 사용자 상태와 연결해 저장합니다.
- 브라우저에는 세션 ID를 쿠키로 전달합니다.
- 이후 요청에서 서버가 세션 ID를 조회해 사용자를 식별합니다.
실제 세션 데이터는 메모리, 데이터베이스, Redis 같은 저장소에서 관리할 수 있습니다. 서버가 여러 대라면 요청을 받은 서버가 같은 세션 상태를 확인할 수 있도록 설계해야 합니다.
비교할 때 주의할 점
| 구분 | 쿠키 | 서버 세션 |
|---|---|---|
| 데이터 위치 | 브라우저 | 서버 측 저장소 |
| 주된 역할 | 값을 보관하고 요청에 전달 | 사용자별 상태 관리 |
| 만료 기준 | 쿠키 속성과 브라우저 정책 | 서버의 만료·폐기 정책 |
| 로그인에서의 관계 | 세션 ID 전달 | ID에 연결된 인증 상태 보관 |
브라우저를 닫았다고 서버 세션이 즉시 삭제되는 것은 아닙니다. 세션 쿠키도 브라우저의 세션 복원 기능에 따라 복원될 수 있습니다. 로그아웃은 서버에서 세션을 무효화하고 브라우저 쿠키도 만료시키는 방식으로 처리합니다.
서버에 저장한다고 자동으로 안전해지는 것도 아닙니다. 세션 ID가 탈취되면 악용될 수 있으므로 HTTPS, 적절한 쿠키 속성, 세션 만료와 인증 후 ID 갱신 등을 함께 적용합니다.
참고