쿠키 설정 중 SameSite 속성

대영·2024년 7월 20일
2

트러블 슈팅

목록 보기
3/5

🙏내용에 대한 피드백은 언제나 환영입니다!!🙏

🚨 트러블 내용

로그인 과정 중, refreshToken을 Cookie에 저장할 때 생긴 문제이다.
백엔드 서버 자체에 웹페이지를 만들어 로그인을 실행하면 Cookie에 설정한 값인 refreshToken이 제대로 담긴다.

하지만, 클라이언트-서버의 연결인 2계층 아키텍처로 구성하였을 때 문제가 발생한다.

내가 원하는 시나리오는 '클라이언트에서 로그인 요청 -> 서버에서 로그인 처리 -> 서버에서 Cookie에 refreshToken 저장'이다.

그러나, Cookie에 refreshToken이 저장되지 않는다. 왜 그럴까?

👉 SameSite 속성

SameSite라는 것을 알게 되었다.

SameSite란❓

SameSite란, 제 3자에서 요청 (다른 도메인에서의 요청)에 대해서 허용을 할지 안할지를 설정하는 것이다.

설정의 종류로는 다음과 같다.

SameSite=Strict

쿠키가 오직 동일한 사이트에서만 전송. 도메인과 서브도메인이 완전히 일치하여야한다.

ex) 도메인: example.com, 서브도메인: www.example.com

SameSite=Lax

쿠키가 동일한 사이트에서만 전송되지만, 일부 경우에는 제3자에도 전송.

ex)
1. 사용자가 접속한 도메인 : example.com (쿠키가 SameSite=Lax 설정)
2. 사용자가 접속한 도메인인 example.com에서 다른 도메인(other.com)으로 접속
3. SameSite=Lax설정된 쿠키가 다른 도메인(other.com) 으로 전송

SameSite=None

쿠키가 동일한 사이트와 제3자에게 모두 전송.

어떤걸 적용해야 할까❓

보통 클라이언트와 서버의 도메인은 다르다. 예시를 들자면 아래와 같다.
클라이언트 : example.com
서버 : api.example.com

그렇기 때문에 서로 다른 도메인에 대해 쿠키를 전송하기 위해서는 SameSite=None으로 설정하여야 한다. 이렇게 되면 다른 도메인으로 부터 접근이 허용되기 때문에 보안이 위험해질 수 있다.
그래서 추가적으로 https 요청에서만 전송되도록 secure를 true설정해줘야 한다.

여기서 SameSite=None 설정을 하면, CSRF(Cross-Site Request Forgery) 공격에 대해서 걱정할 수 있다. 하지만, CSRF는 다른 도메인에서 서버의 도메인에 악의적인 요청을 보내지만, 응답을 받을 수는 없어 refreshToken의 주 기능인 accessToken을 재발급 받지 못한다.

👉 설정 예시

SameSite 설정을 하기 위해서는 아래와 같이 ResponseCookie를 사용해야한다.

/* 쿠키 생성 메서드 */
    public ResponseCookie createCookie(String key, String value) {

        return ResponseCookie.from(key, value)
                .path("/")
                .httpOnly(true)
                .maxAge(COOKIE_REFRESH_EXPIRATION)
                .secure(true)
                .sameSite("None")
                .build();
    }
profile
Better than yesterday.

0개의 댓글