Same Site란?
크롬 정책에서 비롯한 쿠키 정책이며 SameSite라는 속성의 기본 값을 None에서 Lax로 변경한 것이다.
이는 CSRF 및 의도하지 않은 정보 유출에 대한 취약성에 대처하기 위함이다.
SameSite 속성
총 3가지의 종류가 있다.
Strict, Lax, None
Strict
👉 SameSite간의 요청에서만 쿠키의 전송을 허용하며 가장 완벽한하지만 편의성이 떨어진다.
Lax
👉 기본적으로는 Strict지만 Cross Site 요청에서도 “Safe”한 요청인 Http GET, a태그, link태그를 통한 접근은 허용한다.
None
👉 Same Site 요청은 물론 Cross Site의 요청에도 모두 전송을 허용한다. 그렇기때문에 보안에 취약하다. None을 사용하려면 반드시 HTTPS 프로토콜 하에서 Secure 속성과 함께 사용해야 한다.
쉽게 요약하면 Strict < Lax < None 순으로 보안에 취약하다는 것이다.
Spring 5.0
스프링 5에서부터 추가된 ResponseCookie 클래스, 코드를 보면서 이해하자.
작성한 코드
> 설명
해당 코드는 프로젝트 내에 있는 코드 중 일부분(Controller)이다.
UUID를 랜덤으로 생성 후 로그인 시 accessToken을 발급하는 형태이다.
이때 발급 받은 accessToken을 쿠키로 감싸서 헤더에 넣어 응답을 내려주도록 구성된 Contorller이다.
@RestController
@RequiredArgsConstructor
public class AuthController {
private final AuthService authService;
@PostMapping("/auth/login")
public ResponseEntity<?> login(@RequestBody Login login) {
String accessToken = authService.signin(login);
ResponseCookie responseCookie = ResponseCookie.from("SESSION", accessToken)
.domain("localhost")
.path("/")
.httpOnly(true)
.secure(false)
.maxAge(Duration.ofDays(30))
.sameSite("Strict")
.build();
return ResponseEntity.ok()
.header(HttpHeaders.SET_COOKIE, responseCookie.toString())
.build();
}
}
ResponseCookie 옵션 설명
path: URL 경로이다.
httpOnly : XSS 공격을 방지하기 위한 옵션이다.
secure : HTTPS 프로토콜 상에서 암호화된 요청을 위한 옵션이다.
maxAge : 쿠키의 유통기한 옵션이다.
sameSite : 서로 다른 도메인간의 쿠키 전송에 대한 보안을 설정하는 옵션이다.
참고자료
블로그 : https://devvkkid.tistory.com/265
블로그 : https://goodteacher.tistory.com/496