문제상황
로그인 요청 후 cookie에 refresh token을 담아 보내주고 있는데, 로컬 서버에서 로컬 클라이언트로 테스트를 하면 정상적으로 cookie에 담겨서 보내지지만 배포 후 로컬 클라이언트로 테스트를 하면 보내지지 않는 문제가 있다.
해결과정
첫번째 시도 - SameSite 설정을 None으로 바꿔본다.
same-site 옵션
csrf 공격을 방어하기 위한 옵션으로 같은 도메인에서만 쿠키를 전달하거나(strict) 안전한 요청인 get을 통하는 경우에만 쿠키를 전달(Lax)하자는 것이다. 이를 None으로 설정하면 보안 위협을 받을 수 있기 때문에 secure 옵션을 추가해주어야며, 실제로 사용하는 것이 아니라 개발 환경에서만 사용해야한다.
또, secure 옵션을 사용하기 위해서는 https 를 사용해야한다고 한다.
cookie옵션을 바꿔보자
기존의 cookie를 생성하는 코드는 다음과 같다
Cookie cookie = new Cookie(name, value);
cookie.setPath("/");
cookie.setHttpOnly(true); // XSS 공격을 막기 위한 설정
cookie.setMaxAge(maxAge);
cookie.setSecure(true);
response.addCookie(cookie);
여기서 생성한 Cookie
객체에는 SameSite관련 API를 지원하지 않기 때문에 respone에 직접 추가하거나, ResponseCookie
객체를 생성하여 옵션을 바꿀 수 있다.
변경한 cookie 생성 코드
ResponseCookie cookie = ResponseCookie.from(name, value)
.path("/")
.httpOnly(true)
.maxAge(maxAge)
.secure(true)
.sameSite("None")
.build();
response.addHeader("Set-Cookie", cookie.toString());
하지만 여전히 쿠키는 보내지지 않고 있다. 뭐가 문제지...
다시 구글링을 해보자!
두번째 시도 - 프론트와 백의 도메인을 맞춘다 (서브 도메인)
쿠키는 같은 도메인 혹은 서브 도메인 간의 교류가 가능하다고 한다. 따라서 프론트 측에서 서브 도메인을 추가해보기로 했다.
서브 도메인을 추가하는 방법은 다음 글을 참고했다.
AWS Route 53 활용하여, Sub domain 생성하고, SSL 적용하기
AWS Route 53 활용하여, Sub domain 생성하고, SSL 적용하기
사용 동기 클라이언트 웹사이트를 가비아에서 도메인을 구입하여 사용중이었다. 근데 Beanstalk 환경으로 생성한 서버 URL도 깔끔하게 보이기 위해 도메인을 붙이고자 했는데 도메인을 또 사기에
2donny-world.tistory.com
우리가 맞춘 메인 도메인과 서브 도메인명은 다음과 같다.
메인 도메인 - bae-chelin.com
서브 도메인 - api.bae-chelin.com
서브 도메인을 맞춘 다음에는 쿠키에 domain 설정을 추가해주어야하는데, 서브도메인을 이용할 때에는 same-site 속성이 필요 없다고 한다.
다음과 같이 설정을 추가해주자
ResponseCookie cookie = ResponseCookie.from(name, value)
.domain(".bae-chelin.com")
.path("/")
.httpOnly(true)
.maxAge(maxAge)
.build();
response.addHeader("Set-Cookie", cookie.toString());
위와 같이 domain 설정에 ".bae-chelin.com" 을 추가해주었다. 이렇게 쿠키를 사용하고자 하는 도메인을 직접 설정해줌으로써 쿠키를 메인과 서브 도메인 모두에서 사용할 수 있게 된다.
이때, .
을 넣어줘야 서브도메인도 인식한다고 하니 잊지 말자!
결국 서브도메인이 답이었다! same-site 속성이 작동하지 않는 이유는 더 알아봐야할 것 같다.
'Study > Trouble Shooting' 카테고리의 다른 글
[삽질로그] 소셜 로그인 후 생성한 JWT에 ADMIN 권한 부여하기 (0) | 2022.07.21 |
---|---|
[삽질로그] CORS 정책 위반 (0) | 2022.06.19 |
[삽질로그] 소스트리 강제 종료 에러 (0) | 2022.06.11 |
[삽질로그] JPA 지연로딩 (0) | 2022.06.08 |
[삽질로그] Entity 관련 삽질 (0) | 2022.06.08 |