🍪

http cookie가 클라이언트 배포에서는 동작하지만 로컬에서 동작하지 않음

생성일
2024/08/19 00:07
태그
Backend

Problem

http cookie가 배포된 환경에서는 잘 동작했는데, 로컬에서 동작을 안합니다.
이런 형태로 에러가 나왔습니다.
에러메세지: This Set-Cookie header didn't specify a "SameSite" attribute and was defaulted to "SameSite=Lax", and was blocked bacause it came from a cross-site response which was not the response to a top-level navigation. The Set-Cookie had to have been set with "SameSite=None" to enable cross-site usage.

SameSite 옵션이란?

SameSite 쿠키 속성은 웹 애플리케이션이 크로스 사이트 요청으로부터 보호하기 위해 사용하는 보안 기능입니다. 이 속성을 통해 웹 브라우저는 쿠키를 전송할지 여부를 결정할 수 있습니다.

SameSite 속성 값

1.
Lax: 기본 설정으로, 쿠키는 사용자 이동에 따른 GET 요청에서만 전송됩니다. 다른 모든 요청(예: POST, PUT, DELETE)에서는 전송되지 않습니다.
2.
Strict: 가장 엄격한 설정으로, 사용자가 사이트를 탐색할 때만 쿠키가 전송됩니다. 다른 모든 크로스 사이트 요청에서는 전송되지 않습니다.
3.
None: 쿠키가 모든 요청에 대해 전송됩니다. 이 설정을 사용하려면 쿠키에 Secure 속성이 함께 설정되어야 합니다.

에러 발생 이유

에러 메시지에서 언급된 것처럼, SameSite 속성이 명시되지 않은 쿠키는 기본적으로 Lax로 설정됩니다. 이는 크로스 사이트 요청에서 쿠키가 차단될 수 있음을 의미합니다. 특히 배포된 환경에서는 크로스 사이트 요청이 많기 때문에, SameSite 속성을 None으로 설정하고 Secure 속성을 추가해야 쿠키가 제대로 전송될 수 있습니다.

How to solve

쿠키의 SameSite 속성을 None으로 설정하고, 크로스 사이트 사용을 허용하려면 쿠키를 Secure로 표시해야 합니다. 로컬 같은 경우는 SameSite 속성을 Lax으로 설정하고 Secure을 false값으로 해야 정상 작동 됩니다.
/** * ResponseCookieBuilder를 생성합니다. */ private ResponseCookie.ResponseCookieBuilder createResponseCookieBuilder(String name, String value, int maxAge, boolean isLocal) { ResponseCookie.ResponseCookieBuilder cookieBuilder = ResponseCookie.from(name, value) .httpOnly(true) .path("/") .maxAge(maxAge); if (isLocal) { // 로컬 cookieBuilder.secure(false).sameSite("Lax"); } else { // 배포 cookieBuilder.secure(true).sameSite("None"); } return cookieBuilder; }
Java
복사