쿠키와 세션
쿠키와 세션
쿠키(Cookie)와 세션(Session)은 HTTP 프로토콜의 무상태성(Stateless)을 보완하여 클라이언트(브라우저)와 서버 간의 상태를 유지하고 사용자 정보를 관리하기 위한 핵심 기술입니다. HTTP는 각 요청이 독립적이므로, 사용자 로그인 상태나 장바구니 정보 등을 유지하기 위해 이 두 가지 메커니즘이 필요합니다.
🍪 쿠키 (Cookie)
- 개념 (Concept) : 클라이언트(브라우저) 측에 저장되는 작은 데이터 조각입니다. 서버가 클라이언트에게 데이터를 저장하도록 요청하고, 클라이언트는 이후 요청 시 해당 데이터를 서버로 다시 전송합니다.
- 저장 위치 : 클라이언트의 웹 브라우저.
- 특징
> * 클라이언트 저장 : 브라우저에 저장되므로, 사용자가 직접 삭제하거나 조작할 수 있습니다. > * 데이터 크기 제한 : 보통 4KB 이하로 제한됩니다. > * 보안 취약 : 클라이언트에 저장되므로 보안에 취약합니다. (민감한 정보 저장 부적합) > * 만료 기간 설정 : 만료 기간을 설정할 수 있으며, 기간이 지나면 자동 삭제됩니다.
- 활용 사례 : 로그인 상태 유지("로그인 유지" 기능), 사용자 환경 설정(웹사이트 테마, 언어), 장바구니(비로그인 상태), 광고 추적.
🔑 세션 (Session)
- 개념 (Concept) : 서버 측에 저장되는 사용자 정보입니다. 클라이언트에는 세션 ID(Session ID)만 저장하고, 이 ID를 통해 서버에서 해당 사용자의 세션 정보를 찾아 사용합니다.
- 저장 위치 : 서버의 메모리 또는 데이터베이스.
- 특징
> * 서버 저장 : 서버에 저장되므로 비교적 보안에 강합니다. > * 데이터 크기 제한 없음 : 서버의 자원이 허용하는 한 저장할 수 있는 데이터 크기에 제한이 없습니다. > * 만료 기간 : 브라우저 종료 시 또는 설정된 만료 시간 경과 시 세션이 만료됩니다.
- 활용 사례 : 로그인 상태 유지(보안이 중요한 경우), 사용자 인증, 장바구니(로그인 상태).
🆚 쿠키와 세션의 비교
| 특징 | 쿠키 (Cookie) | 세션 (Session) | |---|---|---| | 저장 위치 | 클라이언트 (브라우저) | 서버 | | 보안 | 취약 (탈취, 변조 가능) | 비교적 안전 | | 저장 데이터 | 제한적 (4KB 이하) | 제한 없음 (서버 자원 허용 범위 내) | | 속도 | 빠름 (클라이언트에서 바로 접근) | 느림 (서버에서 조회 필요) | | 만료 시점 | 설정 가능 (브라우저 종료와 무관) | 브라우저 종료 시 또는 설정 시간 경과 시 | | 사용 예시 | 로그인 유지, 장바구니(비로그인), 광고 추적 | 로그인 상태 유지(보안), 사용자 인증, 장바구니(로그인) |
💡 개발자 핵심 Point
- 쿠키와 세션은 HTTP의 무상태성(Stateless)을 보완하여 사용자 경험을 향상시키는 핵심 기술입니다.
- 보안 고려 : 민감한 정보(비밀번호, 개인 식별 정보)는 절대 쿠키에 직접 저장해서는 안 됩니다. 세션 ID만 쿠키에 저장하고, 실제 정보는 서버의 세션에 저장하는 것이 안전합니다.
- 세션 하이재킹 (Session Hijacking) : 공격자가 세션 ID를 탈취하여 사용자 권한을 획득하는 공격입니다. 이를 방지하기 위해 세션 ID를 HTTPS를 통해 전송하고, 세션 타임아웃을 적절히 설정하며, 세션 ID를 주기적으로 변경하는 등의 보안 조치가 필요합니다.
- 토큰 기반 인증 (Token-based Authentication) : JWT(JSON Web Token)와 같은 토큰 기반 인증 방식은 세션의 단점(서버 자원 소모, 확장성 문제)을 보완하기 위해 등장했습니다. 토큰은 클라이언트에 저장되며, 서버는 토큰의 유효성만 검증하므로 서버 부담이 적고 확장성이 좋습니다.