반응형
웹 서비스 운영에서 **쿠키(Cookie)**와 **세션(Session)**은 사용자 경험과 보안을 동시에 책임지는 핵심 요소입니다. 로그인 상태 유지, 사용자 설정 저장, 서비스 연속성 보장 등 편리한 기능 뒤에는 반드시 보안 고려가 따라야 합니다. 이번 글에서는 쿠키와 세션의 원리, 보안 속성, 그리고 운영자가 꼭 챙겨야 할 체크리스트를 정리합니다.
1. 쿠키와 세션의 기본 원리
쿠키란?
쿠키는 서버가 브라우저에 내려주는 작은 데이터 조각입니다. 브라우저는 이를 저장했다가 같은 도메인에 요청을 보낼 때마다 자동으로 포함시킵니다.
- 주요 역할: 사용자 식별, 세션 유지, 환경설정 저장
- 예시:
-
HTTP/1.1 200 OK Set-Cookie: sessionId=abc123; Path=/; HttpOnly; Secure
세션이란?
세션은 서버가 사용자의 상태 정보를 일정 시간 동안 기억하는 메커니즘입니다.
- 보통 서버는 세션을 **저장소(DB, Redis 등)**에 기록하고, 브라우저에는 세션 ID만 쿠키로 내려줍니다.
- 이후 브라우저가 요청 시 Cookie: sessionId=abc123을 자동 포함 → 서버가 해당 ID로 세션을 조회해 사용자 정보를 확인합니다.
즉, 쿠키는 세션을 이어주는 키(key) 역할을 한다고 볼 수 있습니다.
2. 쿠키 값이 사람이 읽기 어렵게 설계되는 이유
운영 환경의 쿠키를 보면 난수, Base64, 암호화된 값 등 사람이 읽기 어려운 문자열 형태가 많습니다. 이는 보안상의 이유입니다.
- 민감정보 노출 방지: 평문 사용자 ID/권한을 쿠키에 저장하면 탈취 시 위험
- 변조 방지: 쿠키를 조작해 권한 상승을 시도할 수 있음 → HMAC 서명, 암호화 필요
- 보안 토큰화: 서버만 해독 가능한 세션 토큰을 활용하여 쿠키 자체는 무의미하게 설계
3. 세션 유지 방식의 패턴
1) 서버 사이드 세션 (권장)
- 서버 저장소(예: Redis)에 sessionId → 사용자 정보 매핑 저장
- 브라우저에는 난수 토큰(sessionId)만 저장
- 장점: 서버에서 세션 무효화, 만료, 강제 로그아웃 제어 가능
- 단점: 스케일링 시 세션 공유 저장소 필요
2) 클라이언트 토큰 방식 (JWT)
- 서버가 사용자 정보를 담은 JWT(JSON Web Token)를 발급해 쿠키에 저장
- 서버는 JWT 서명만 검증 → 빠름, 무상태 확장성 용이
- 단점: Payload는 누구나 읽을 수 있어 민감정보 넣으면 위험, 만료·무효화 관리 어려움
3) Access + Refresh 토큰 혼합
- 짧은 만료의 Access Token + 장기 Refresh Token 조합
- 보안성과 UX를 균형 있게 가져갈 수 있는 현대적 접근
4. 쿠키 보안 속성 정리
- Secure: HTTPS 연결에서만 전송
- HttpOnly: JS 접근 차단 → XSS 방어
- SameSite: CSRF 방지 (Strict, Lax, None)
- Domain / Path 제한: 최소 범위로 지정해 남용 방지
- 만료 시간: 오래 남지 않도록 TTL 설정
- 쿠키 이름 프리픽스: __Secure-, __Host- 등 보안 속성 강제
5. 운영자가 꼭 알아야 할 세션 & 쿠키 보안 체크리스트
- 쿠키에는 민감정보 저장 금지 (세션 토큰만)
- 모든 쿠키에 Secure + HttpOnly + SameSite 적용
- 세션 ID는 난수/암호화/서명 처리로 변조 방지
- 로그인 시 세션 고정 방지를 위해 세션 재발급
- 로그아웃 시 서버 측 세션 무효화 처리
- 세션 만료시간 짧게 설정 + 주기적 갱신 정책 운영
- Redis 같은 중앙 세션 저장소 구성(스케일링 대비)
- WAF 로그에서 REQUEST_COOKIES 매칭 탐지 모니터링
6. 결론
쿠키와 세션은 사용자 경험을 만드는 동시에 공격자가 노리는 대표적인 타깃입니다.
- 쿠키는 세션을 이어주는 키,
- 세션은 서버가 사용자를 기억하는 메커니즘입니다.
운영자는 “쿠키는 읽히지 않고, 변조되지 않고, 오래 남지 않는다”는 원칙을 지키는 것만으로도 보안 수준을 크게 높일 수 있습니다.
반응형
'NETWORK' 카테고리의 다른 글
| Redirect, Rewrite, Host Header Forwarding — 요청 전달 기법 완전 정리 (0) | 2025.11.01 |
|---|---|
| [Network] Longest Prefix Match (LPM) 알고리즘 (0) | 2025.10.27 |
| ssl 버전 확인 방법 (0) | 2025.08.04 |
| windows, linux 네트워크 관련 명령어 모음 (1) | 2025.07.30 |
| 소켓이란? 엔드포인트와의 차이점 (0) | 2023.01.31 |
댓글