쿠키에 별도로 설정을 가하지 않는다면, 크롬을 제외한 브라우저들은 모든 HTTP 요청에 대해서 쿠키를 전송하게 된다. 그 요청에는 HTML 문서 요청, HTML 문서에 포함된 이미지 요청, XHR 혹은 Form을 이용한 HTTP 요청등 모든 요청이 포함된다.
CSRF(Cross Site Request Forgery)는 이 문제를 노린 공격이다.
- 공격대상 사이트는 쿠키로 사용자 인증을 수행함.
- 피해자는 공격 대상 사이트에 이미 로그인 되어있어서 브라우저에 쿠키가 있는 상태.
- 공격자는 피해자에게 그럴듯한 사이트 링크를 전송하고 누르게 함. (공격대상 사이트와 다른 도메인)
- 링크를 누르면 HTML 문서가 열리는데, 이 문서는 공격 대상 사이트에 HTTP 요청을 보냄.
- 이 요청에는 쿠키가 포함(서드 파티 쿠키)되어 있으므로 공격자가 유도한 동작을 실행할 수 있음.
CSRF는 워낙 널리 알려진 문제고 워게임에서도 풀고 있으니 참고하기 바란다.
바로 뒤에서 말씀드릴 SameSite는 이 문제를 해결하기 위해 탄생한 기술이다.
SameSite
쿠키의 사용범위를 제한하기 위한 쿠키 옵션으로 쿠키의 보안적 문제를 해결하기 위해 만들어진 기술이다. 크로스 사이트(Cross-site)로 전송하는 요청의 경우 쿠키의 전송에 제한을 두도록 한다.
SameSite 쿠키의 정책으로 None, Lax, Strict 세 가지 종류를 선택할 수 있고, 각각 동작하는 방식이 다르다.
- None: SameSite 가 탄생하기 전 쿠키와 동작하는 방식이 같다. None으로 설정된 쿠키의 경우 크로스 사이트 요청의 경우에도 항상 전송된다. 즉, 서드 파티 쿠키도 전송된다. 따라서, 보안적으로도 SameSite 적용을 하지 않은 쿠키와 마찬가지로 문제가 있는 방식이다.
- Strict: 가장 보수적인 정책이다. Strict로 설정된 쿠키는 크로스 사이트 요청에는 항상 전송되지 않는다. 즉, 서드 파티 쿠키는 전송되지 않고, 퍼스트 파티 쿠키만 전송된다.
- Lax: Strict에 비해 상대적으로 느슨한 정책이다. Lax로 설정된 경우, 대체로 서드 파티 쿠키는 전송되지 않지만, 몇 가지 예외적인 요청에는 전송된다.
퍼스트 파티 쿠키(First-Party-Cookie)
- 사용자(client)가 방문한 웹사이트에서 직접 발행하는 쿠키 파일을 말한다. (서브도메인 포함)
서드 파티 쿠키(Third-Party-Cookie)
- 사용자(client)가 방문한 웹사이트가 아닌, 다른 웹사이트에서 발행한 쿠키 파일을 말한다.
크롬은 SameSite를 가장 적극적으로 적용하고 있는 브라우저다. 원래 SameSite를 명시하지 않은 쿠키는 SameSite가 None으로 동작했지만, 2020년 2월 4일 크롬 80 버전이 배포되면서 SameSite의 기본값이 Lax로 변경되었고, 이 변경사항은 운영되고 있는 웹 서비스들에게 많은 영향을 미쳤다.
Lax 쿠키가 전송되는 경우
A cookie with "SameSite=Lax" will be sent with a same-site request, or a cross-site top-level navigation with a "safe" HTTP method.
즉, 같은 웹 사이트일 때는 전송된다는 것이고, 이 외에는 Top Level Navigation(웹 페이지 이동)과, "안전한" HTTP 메서드 요청의 경우 전송된다.
Top Level Navigation에는 유저가 링크(<a>)를 클릭하거나, window.location.replace 등으로 인해 자동으로 이뤄지는 이동, 302 리다이렉트를 이용한 이동이 포함된다. 하지만 <iframe>이나 <img>를 문서에 삽입함으로써 발생하는 HTTP 요청은 "Navigation"이라고 할 수 없으니 Lax 쿠키가 전송되지 않고, <iframe> 안에서 페이지를 이동하는 경우는 "Top Level"이라고 할 수 없으므로 Lax 쿠키는 전송되지 않는다.
또한 "안전하지 않은" POST나 DELETE 같은 요청의 경우, Lax 쿠키는 전송되지 않는다. 하지만 GET처럼 서버의 서버의 상태를 바꾸지 않을 거라고 기대되는 요청에는 Lax 쿠키가 전송된다.
이 모든 내용은 서드 파티 쿠키에 한하는 것이고, 퍼스트 파티 쿠키는 Lax나 Strict이여도 전송된다.
'Web > 개념정리' 카테고리의 다른 글
[개념정리] case mapping collision (0) | 2024.02.29 |
---|---|
[개념정리] Click jacking (0) | 2024.01.05 |
[개념정리] XSS (0) | 2023.08.23 |
[개념정리] XXE 란? (0) | 2023.08.11 |
[개념정리] UNION (0) | 2023.07.10 |