SameSite 쿠키 동작 매트릭스
SameSite=Strict/Lax/None이 로그인·결제 등 교차 사이트 흐름에서 어떻게 동작하는지 정리합니다.
쿠키의 SameSite 속성은 다른 사이트에서 들어오는 요청에 쿠키를 함께 보낼지 결정하는 핵심 보안 설정입니다. Strict·Lax·None 세 값이 시나리오별로 어떻게 동작하는지 헷갈리기 쉬운데, 이 도구는 링크 클릭·폼 POST·iframe·fetch 같은 교차 사이트 상황에서 쿠키가 전송되는지를 한눈에 보여주는 매트릭스를 제공합니다.
또한 SameSite 값을 골라 실제 Set-Cookie 헤더 예시를 생성하고 복사할 수 있습니다. 헤더가 실제로 어떻게 내려가는지 확인하려면 쿠키 보안 점검로 응답 쿠키를 점검하고, 보안 헤더 점검로 전체 보안 헤더를 함께 검사하는 것을 권장합니다.
| 교차 사이트 시나리오 | Strict | Lax | None (+Secure) |
|---|---|---|---|
| 최상위 내비게이션 GET (링크 클릭) | 전송 안 됨 | 전송됨 | 전송됨 |
| 교차 사이트 폼 POST | 전송 안 됨 | 전송 안 됨 | 전송됨 |
| 교차 사이트 iframe / 임베드 리소스 | 전송 안 됨 | 전송 안 됨 | 전송됨 |
| 교차 사이트 fetch / XHR | 전송 안 됨 | 전송 안 됨 | 전송됨 |
Set-Cookie: session=...; SameSite=Lax; Secure; HttpOnlySameSite 세 가지 값
각 값은 교차 사이트 요청에서 쿠키 전송 범위를 다르게 제한합니다.
- Strict: 같은 사이트(same-site) 요청에만 쿠키 전송. 외부에서 링크를 타고 들어와도 전송되지 않습니다.
- Lax: 최상위 내비게이션 GET(링크 클릭)에만 전송. 교차 사이트 POST·iframe·fetch에는 전송되지 않습니다.
- None: 모든 교차 사이트 요청에 전송. 단 반드시
Secure(HTTPS)와 함께 써야 합니다.
기본값과 None을 써야 할 때
최신 브라우저는 SameSite를 명시하지 않은 쿠키를 기본 Lax로 취급합니다. 따라서 별도 설정 없이도 대부분의 CSRF는 완화됩니다. 결제 위젯, 외부 도메인 임베드, 서드파티 인증처럼 다른 사이트에서 쿠키가 꼭 필요한 경우에만 SameSite=None; Secure를 사용하세요.
SameSite=None인데Secure가 없으면 최신 브라우저는 쿠키를 거부합니다.- 세션 쿠키에는
HttpOnly도 함께 두어 JavaScript 접근을 막는 것이 안전합니다. - 예:
Set-Cookie: session=...; SameSite=Lax; Secure; HttpOnly
상황별 SameSite 선택표
실제 운영에서 마주치는 대표 시나리오와 권장 값, 그 이유를 정리했습니다.
| 사용 상황 | 권장 값 | 이유 |
|---|---|---|
| 같은 사이트 세션 / CSRF 방어 | Lax 또는 Strict | 교차 사이트 POST·fetch에 쿠키가 가지 않아 CSRF가 크게 줄어듭니다. 대부분의 일반 웹앱은 Lax로 충분합니다. |
| SSO / OAuth 리다이렉트(교차 사이트 이동 후 쿠키 필요) | Lax | 최상위 GET 내비게이션에는 쿠키가 전송되므로, 외부 인증 공급자에서 돌아오는 리다이렉트 흐름이 정상 동작합니다. |
| 임베드형 서드파티 위젯 / iframe에서 쿠키 필요 | None (Secure 필수) | iframe·교차 사이트 요청에서도 쿠키를 보내야 하므로 None이 유일한 선택지이며, 반드시 HTTPS와 Secure가 함께 있어야 합니다. |
| 최고 수준의 CSRF 안전성 | Strict | 교차 사이트에서 들어온 첫 요청에도 쿠키를 보내지 않습니다. 다만 외부 링크로 들어오면 로그인 상태가 풀린 듯 보일 수 있어 사용성이 떨어집니다. |
실전 예시: 결제 iframe의 세션 끊김
쇼핑몰이 결제 단계에서 외부 PG사의 iframe을 띄우는데, 결제 화면을 열 때마다 사용자가 로그아웃된 것처럼 세션이 사라진다고 가정해 봅시다. 응답을 점검해 보니 세션 쿠키가Set-Cookie: pgsession=abc; SameSite=Lax; Secure로 내려가고 있었습니다.
- 증상: 결제
iframe안에서만 로그인 상태가 유지되지 않음. - 원인:
iframe은 교차 사이트 컨텍스트라Lax쿠키가 전송되지 않음. (값을 비워 둬도 브라우저 기본이Lax라 동일하게 끊깁니다.) - 조치:
Set-Cookie: pgsession=abc; SameSite=None; Secure로 변경 → 교차 사이트iframe에도 쿠키가 전송되어 세션이 유지됩니다.