특정 URL을 호출하며 쿠키를 전송하려고 하는데 전송이 안 된다..?
일단 현재 페이지와 호출하려는 URL, 쿠키의 도메인에 따라서 전송가능 여부가 달라진다.
확인해야 할 사항
현재 페이지의 도메인, 프로토콜 & 호출하려는 URL의 도메인, 프로토콜 확인
쿠키 전송 방향 | 도메인 | 프로토콜 | 쿠키 전송 가능 여부 | |||
1 | https://site.example.com | ▶ | https://site.example.com | 같음 | 같음 | 그냥 됨 |
2 | https://site.example.com | ▶ | http://site.example.com | 같음 | 다름 | 크로스 사이트로 간주함. 교차스킴 정책 참고 |
3 | https://site.example.com | ▶ | https://site.test.com | 다름 | 같음 | 크로스 사이트로 간주함. 교차스킴 정책 참고 |
4 | https://site.test.com | ▶ | https:// site.example.com | 다름 | 다름 | 크로스 사이트로 간주함. 교차스킴 정책 참고 |
* 크로스 사이트(cross-site)
호출하는 URL이 도메인이 다른경우 혹은 http, https 와 같이 사용하는 프로토콜(scheme)이 다른 사이트의 경우
* 서드파티 쿠키
사용자가 접속한 페이지와 다른 도메인에서 발행한 쿠키
* 퍼스트파티 쿠키
사용자가 접속한 페이지의 도메인에서 발행한 쿠키
일반적으로 크로스 사이트(Cross-site)로의 쿠키전송은 안 됨. 서드파티 쿠키전송이 안 됨.
하지만 쿠키의 SameSite 속성 설정으로 서드파티 쿠키 전송을 가능하게 할 수 있다.
* SameSite 속성
SameSite 속성은 크로스사이트 요청에서 쿠키 전송을 제한하는 기능을 한다.
쿠키 생성 시 SameSite 속성 설정하는 예시
javascript
document.cookie = "mycookie=testContent; domain=example.com; Path=/; SameSite=None; Secure;"
JAVA
@RequestMapping(value = "/test/setCookieTest")
public HttpServletResponse setCookieTest(HttpServletRequest request, HttpServletResponse response) throws Exception {
String cookieValue = "CookieTest=CookieTest; Max-Age=3600; Path=/; SameSite=Lax";
Domain="example.com;";
response.addHeader("Set-Cookie", cookieValue);
return response;
}
SameSite 속성값 | 설명 |
none | none으로 설정된 쿠키의 경우 크로스 사이트 요청의 경우에도 항상 전송됨 Secure 속성을 꼭 함께 붙여줘야 함 |
Strict | 크로스 사이트 요청에는 항상 전송되지 않음 |
Lax | 몇 가지 예외적인 요청에만 전송됨 예) <a>를 클릭해서 이동 windows.location.replace 로 자동으로 이동 302 리다이렉트를 통한 이동 <iframe>이나 <img>를 삽입할 때 발생되는 http 요청은 쿠키 전송 안 됨. |
samesite 속성이 Lax이거나 None이며 secure 속성도 넣었는데 전송이 안된다면...?
아래 교차스킴 정책을 참고해보자..
교차스킴 유형에 따른 쿠키 전송 정책
* 교차스킴
URL이 모두 동일한 등록 가능 도메인(예: site.example)을 가지고 있지만
스킴(프로토콜)은 서로 다르며(예: http://site.example과 https://site.example), 이를 교차 스킴이라고 한다.
2020년 이후로 구글에서 교차스킴에 대한 쿠키전송 정책을 변경한다고 했다.
이제 도메인이 같아도 프로토콜이 다르면 크로스사이트로 간주한다 이말인듯
아래의 교차 스킴 유형에 따라 쿠키 전송을 위한 SameSite 속성값이 다름..
1) case 1 - Navigation
페이지 이동하는 경우라고 생각하면 될 듯하다.
하이퍼링크를 클릭해서 페이지를 이동하거나
<a>를 클릭해서 이동하거나 windows.location.replace 로 자동으로 이동하거나,
302 리다이렉트를 통한 이동을 포함함.
쿠키의 SameSite 값에 따라 쿠키가 전송될수도, 안 될수도 있다.
2) case 2 - 하위 리소스 요청
페이지 내에서 iframe이나 script, fetch, XMLHttpRequest를 통해 url을 요청하는 경우
3) case3 - POST양식 submit
form데이터를 POST 전송하는 경우이다.
아무리 정리해봐도 넘 헷갈리는...
틀린 부분이 있으면 댓글로 알려주십셔
참고
https://web.dev/i18n/en/schemeful-samesite/
https://developer.mozilla.org/en-US/docs/Web/Security/Mixed_content
'코딩 관련 > 기타' 카테고리의 다른 글
[HTML] 데이터 전송 시 문자 자동 escape 되는 현상 (0) | 2023.08.22 |
---|---|
[maven] Maven Dependencies 없음 / build path maven dependencies (0) | 2023.08.09 |
Intellij 환경변수 등록하기 (0) | 2023.02.04 |
[SVN] eclipse에서 SVN update / commit 하기 (0) | 2022.08.18 |
[HTTP] Cache-Control 헤더 (0) | 2022.07.27 |