> [!date] published: 2025-06-29
## SameSite란
[Set-Cookie header - HTTP \| MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Set-Cookie#samesitesamesite-value)
Set-Cookie 헤더의 속성 중 하나인데 cross-site 요청에도 쿠키를 보낼지 여부를 설정하는 역할을 한다. 이 설정을 통해서 CSRF같은 cross-site 공격을 방어할 수 있다.
속성값으로 설정할 수 있는 값은 이렇게 3가지이다.
- `Stirct`
- `Lax`
- `None`
## Strict
이 녀석은 쿠키를 설정한 사이트와 동일한 사이트에서 발생한 요청에 대해서만 쿠키를 전달한다는 설정이다. 백엔드의 역할과 프론트엔드의 역할이 분리되어 있는 요즘은 일반적으로 이 설정을 사용하지 않을 것이라고 생각했다... 예를 들어보자
**\[상황\]**
- 프론트엔드는 app.example.com으로 서빙
- 백엔드는 api.example.com으로 서빙
**\[Case 1\] 백엔드에서 쿠키를 설정하는 경우**
```http
Set-Cookie: sessionId=abc123; SameSite=Strict;
```
- 백엔드 내부에서 직접 요청하는 경우에는 쿠키가 전달된다. (api.example.com -> api.example.com)
- 프론트엔드에서 백엔드로의 API 요청 시에는 전달되지 않는다. (app.example.com -> api.example.com)
**\[Case 2\] 프론트엔드에서 쿠키를 설정하는 경우**
```http
document.cookie = "userPref=dark; SameSite=Strict;
```
- 프론트엔드 내에서 페이지 이동 시에 전달된다.
- 백엔드로의 API 요청 시에는 전달되지 않는다.
이러한 사유로... 지금까지의 경험으로는 `SameSite=Strict` 속성을 사용할 수 있는 상황이 한번도 없었어서 언제 사용할 수 있는지 궁금했는데
- 전통적인 웹 어플리케이션 (서버에서 모든 작업을 다 하는 웹 어플리케이션)
- `example.com` 에서 프론트엔드 서빙을 하고 `example.com/api` 에서 백엔드 서빙을 하는 경우...
Nginx나 CloudFront 같은 설정이 필요하긴 하지만 이렇게 하면 CORS 에러도 해결되고 SSL 인증서도 하나로 둘다 사용할 수 있는 등 장점이 있다고 한다...
이런 경우에는 `SameSite=Strict` 속성을 적용할 수 있다고 한다.... 🤔
## Lax
이 설정은 쿠키를 설정한 사이트와 동일한 사이트에서 발생한 요청과 아래 두 조건을 모두 만족하는 cross-site 요청에 대해서만 쿠키를 전송할 수 있게 하는 것이다.
- 요청이 최상위 탐색이어야 한다. : 브라우저 주소창의 URL이 변경되는 경우
- 요청이 안전한 메서드를 사용해야 한다. (POST, PUT, DELETE는 안된다.)
간단히 이렇게 정리할 수 있을 것 같다.
- 같은 사이트라면 어떤 요청이든 가능
- a 태그로 전송하는 GET 요청 같은 경우라면 가능
- 그 외엔 불가!
(내 뇌피셜...) 약간 유도리를 주되 안전하지 않은 메소드는 막아 악의적인 공격은 막을 수 있어서 많은 브라우저에서 Lax를 기본 옵션으로 제공한다는 것 같다..
> [!note]
> mdn에서 말하길 Lax를 기본값으로 적용하는 브라우저들에서는 보통 좀 더 관대한 버전의 Lax를 사용한다고 한다.
> 좀 더 관대한 버전의 Lax는 쿠키가 설정된 지 2분 이내라면 POST 메서드를 허용한다.
## None
요거는 사실상 SameSite 보호를 무력화하는 설정이다. same-site든 cross-site든 쿠키를 보낼 수 있게 한다.
이 값을 사용할 때에는 반드시 Secure 속성도 함께 설정되어야 한다.
## Secure
[Set-Cookie header - HTTP \| MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Set-Cookie#secure)
이 설정은 https 연결 안에서만 쿠키를 전달할 수 있게 하는 설정