쿠키 보안은 세션 하이재킹, CSRF, 추적 등의 공격으로부터 쿠키를 보호하는 다양한 속성과 기법을 포함한다. SameSite, HttpOnly, Secure, Partitioned 속성이 핵심이다.
쿠키 보안 속성
| 속성 | 역할 | 권장 설정 |
|---|
| Secure | HTTPS에서만 전송 | 항상 설정 |
| HttpOnly | JS 접근 차단 (XSS 방어) | 세션 쿠키에 항상 |
| SameSite | 크로스 사이트 전송 제어 | Strict 또는 Lax |
| Domain | 쿠키 유효 도메인 | 최소화 |
| Path | 쿠키 유효 경로 | 최소화 |
| Expires/Max-Age | 만료 시간 | 세션은 미설정 |
| Partitioned | 파티션된 저장소 | CHIPS 구현 |
SameSite 속성 상세
SameSite=Strict:
- 동일 사이트 요청에만 전송
- 외부 링크 클릭 시 쿠키 미전송
- 보안 최강, UX 영향 있음
SameSite=Lax (기본값):
- 안전한 HTTP 메서드(GET) + 최상위 탐색에서 전송
- POST 폼 제출 시 크로스 사이트 미전송
- 대부분의 앱에 적합
SameSite=None:
- 크로스 사이트 요청에도 전송
- Secure 속성 필수
- 임베드 위젯, OAuth 콜백 등에서 필요
없음 (기본):
- Lax처럼 동작 (현대 브라우저)
CHIPS (Partitioned Cookies)
http
# 서드파티 쿠키 대체: 파티션된 쿠키
# 임베드된 사이트가 최상위 사이트별 별도 쿠키 저장
Set-Cookie: session=abc; Secure; SameSite=None; Partitioned
# a.com에 임베드된 cdn.example.com의 쿠키가
# b.com에 임베드될 때는 다른 값으로 분리됨
# → 크로스 사이트 추적 불가
Node.js 세션 쿠키 설정
javascript
// Express + express-session
app.use(session({
secret: process.env.SESSION_SECRET,
name: '__Host-session', // __Host- 접두사: 보안 강화
cookie: {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
sameSite: 'lax',
maxAge: 7 * 24 * 60 * 60 * 1000, // 7일
// domain 미설정: 현재 도메인만
path: '/'
},
resave: false,
saveUninitialized: false
}));
// __Host- 쿠키: Domain 없음 + Path=/ + Secure 필수
// __Secure- 쿠키: Secure 필수
관련 문서