서드 파티 쿠키 | Privacy Sandbox :: 브라우저에 쿠키 저장이 안 될 때
::Google의 서드 파티 쿠키 제한확대
https://developers.google.com/privacy-sandbox/cookies?hl=ko#report-issues
서드 파티 쿠키 | Privacy Sandbox | Google for Developers
이 페이지는 Cloud Translation API를 통해 번역되었습니다. 의견 보내기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 개인 정보 보호 솔루션으로 이전 문제가
developers.google.com
::Cookie
사용자가 방문한 웹사이트에서 사용자의 브라우저에 접속하는 임시 파일.
사이트에서 쿠키로 사용자의 정보를 기억하기 때문에, 다음에 해당 사이트에 들어가면 그 웹사이트가 기억하고 있는 정보를 띄워줘서 개인화된 서비스가 가능합니다. 사용자가 최근에 본 상품 리스트를 보여주는 경우가 예시가 될 수 있습니다.
::Privacy Sandbox(개인 정보 보호 샌드박스)
구글의 쿠키 제한.
쿠키를 구글은 왜 제한하는 이유는 바로 서드 파티(3rd party) 쿠키 때문입니다.
서드 파티 쿠키란 사용자가 방문한 웹사이트에 웹사이트 소유자가 아닌 제 3자가 해당 웹사이트에서 사용자의 행태를 기록, 추적하는 것입니다. 웹사이트 소유자가 고객에 대해 직접 모으는 데이터인 퍼스트 파티(1st party) 쿠키와는 달리 제3자가 고객의 데이터를 모으는 행위를 말합니다.
#️⃣출처 : https://stibee.com/api/v1.0/emails/share/b-C_tHu_wCSKVq_W1DMl5OcLLmn-VQ==
최근 로그아웃, 유저토큰재발급 서비스를 구현하면서 헤더에 쿠키 설정을 하고있었는데요.
- 로그아웃 시 헤더의 쿠키 삭제(쿠키 만료 시간을 0으로 설정),
- 유저토큰재발급 시 헤더에 토큰을 저장
쿠키 설정이 제대로 저장되지 않고 있어서, 위의 API 서비스를 호출할 때마다 에러가 발생했습니다.
로그아웃 API
AS-IS
@ApiOperation(value="23. 로그아웃", notes = "응답 헤더 쿠키 내의 토큰 제거를 위한 로그아웃 기능",
produces = "application/json", response = CommonsRes.class)
@ApiResponses({
@ApiResponse(code = 200, message = "", response = CommonsRes.class)
})
@PostMapping("/logout")
@LogTracer(apiAppType = "postman", logType = "API", apiClass = "00_21_TEST", svcClass = "JSON")
public ResponseEntity<Response> logout(HttpServletResponse httpRes) throws Exception {
// 쿠키 초기화
Cookie cookie = new Cookie("refresh-token", null);
cookie.setMaxAge(0);
cookie.setMaxAge(0); // 쿠키 만료 시간 0으로 설정하여 삭제
cookie.setPath("/"); // 쿠키의 경로를 정확하게 설정 (쿠키가 생성된 경로)
cookie.setHttpOnly(true); // 기존 쿠키가 httpOnly 속성을 가지고 있었다면 동일하게 설정
cookie.setSecure(true); // 기존 쿠키가 secure 속성을 가지고 있었다면 동일하게 설정
cookieRes.addCookie(refreshTokenCookie);
Response response = ReturnResponse.builder()
.rsp_cd(HttpResponseStatus.SUCCESS.getResCode())
.rsp_msg(HttpResponseStatus.SUCCESS.getDescription())
.build();
log.info(CommonUtil.responseToResponseBody(response));
return new ResponseEntity<Response>(response, HttpStatus.OK);
}
위의 쿠키 설정만으로, 쿠키가 저장되지 않는 이유를 확인해보니
크롬 버전이 업데이트 되면서, 크롬의 SameSite 기본값이 None -> Lax로 업데이트 되었고.
SameSite가 Lax로 설정되면, 다른 도메인 주소간의 요청에서 쿠키를 담아주지 않는다는 것이었다.
(현재 개발중인 서비스에서는 프론트 도메인에서 -> API 도메인 으로 요청을 보내고 있어서 쿠키가 담기지 않은것)
http → http 크로스 도메인 쿠키 전송
http → http로 서로 다른 도메인에서 쿠키를 심었을 경우 sameSite 기본값(Lax)일 경우 쿠키가 저장은 되는데 새로고침하면 증발함 쿠키 보내는 것 안됨 크롬에서 크로스 사이트를 사용 가능하도록 sa
msm1307.tistory.com
TO-BE
@ApiOperation(value="23. 로그아웃", notes = "응답 헤더 쿠키 내의 토큰 제거를 위한 로그아웃 기능",
produces = "application/json", response = CommonsRes.class)
@ApiResponses({
@ApiResponse(code = 200, message = "", response = CommonsRes.class)
})
@PostMapping("/logout")
@LogTracer(apiAppType = "postman", logType = "API", apiClass = "00_21_TEST", svcClass = "JSON")
public ResponseEntity<Response> logout(HttpServletResponse httpRes) throws Exception {
// 쿠키 초기화
Cookie cookie = new Cookie("refresh-token", null);
cookie.setMaxAge(0);
cookie.setMaxAge(0); // 쿠키 만료 시간 0으로 설정하여 삭제
cookie.setPath("/"); // 쿠키의 경로를 정확하게 설정 (쿠키가 생성된 경로)
cookie.setHttpOnly(true); // 기존 쿠키가 httpOnly 속성을 가지고 있었다면 동일하게 설정
cookie.setSecure(true); // 기존 쿠키가 secure 속성을 가지고 있었다면 동일하게 설정
List<String> domains = Arrays.asList(
"domainSite.com:8080",
"domainSite.com:38443",
"domainSite.com"
);
// 각 도메인에 대해 쿠키 설정
for (String domain : domains) {
cookie.setDomain(domain);
String cookieHeader = String.format(
"%s=%s; Max-Age=%d; Path=%s; Domain=%s; HttpOnly; Secure; SameSite=Strict",
cookie.getName(),
cookie.getValue(),
cookie.getMaxAge(),
cookie.getPath(),
cookie.getDomain()
);
httpRes.addHeader("Set-Cookie", cookieHeader);
}
Response response = ReturnResponse.builder()
.rsp_cd(HttpResponseStatus.SUCCESS.getResCode())
.rsp_msg(HttpResponseStatus.SUCCESS.getDescription())
.build();
log.info(CommonUtil.responseToResponseBody(response));
return new ResponseEntity<Response>(response, HttpStatus.OK);
}
위와 같이 코드를 수정하여 쿠키를 저장할 수 있도록 해결하였습니다.
수정한 부분은 쿠키 헤더 설정을 추가하여 SameSite=Strict로 변경하고, 각 사이트 주소를 명시한 것.
SameSite=None으로 설정하면 Domain 설정 없이도 아래와 같이 처리도 가능하지만 보안이 취약해 질 수 있습니다.
@ApiOperation(value="23. 로그아웃", notes = "응답 헤더 쿠키 내의 토큰 제거를 위한 로그아웃 기능",
produces = "application/json", response = CommonsRes.class)
@ApiResponses({
@ApiResponse(code = 200, message = "", response = CommonsRes.class)
})
@PostMapping("/logout")
@LogTracer(apiAppType = "postman", logType = "API", apiClass = "00_21_TEST", svcClass = "JSON")
public ResponseEntity<Response> logout(HttpServletResponse httpRes) throws Exception {
// 쿠키 초기화
Cookie cookie = new Cookie("refresh-token", null);
cookie.setMaxAge(0);
cookie.setMaxAge(0); // 쿠키 만료 시간 0으로 설정하여 삭제
cookie.setPath("/"); // 쿠키의 경로를 정확하게 설정 (쿠키가 생성된 경로)
cookie.setHttpOnly(true); // 기존 쿠키가 httpOnly 속성을 가지고 있었다면 동일하게 설정
cookie.setSecure(true); // 기존 쿠키가 secure 속성을 가지고 있었다면 동일하게 설정
String cookieHeader = String.format(
"%s=%s; Max-Age=%d; Path=%s; HttpOnly; Secure; SameSite=None",
cookie.getName(),
cookie.getValue(),
cookie.getMaxAge(),
cookie.getPath()
);
httpRes.addHeader("Set-Cookie", cookieHeader);
Response response = ReturnResponse.builder()
.rsp_cd(HttpResponseStatus.SUCCESS.getResCode())
.rsp_msg(HttpResponseStatus.SUCCESS.getDescription())
.build();
log.info(CommonUtil.responseToResponseBody(response));
return new ResponseEntity<Response>(response, HttpStatus.OK);
}
:: 참고
https://brunch.co.kr/@biginsight/69
서드파티 쿠키를 제한하면 생기는 일
(1) 구글 크롬의 서드 파티 쿠키 제한이 디지털 시장에 끼치는 영향 | 과거에 우리가 흔히 알고 있는 광고 마케팅은 4대 매체(TV, 라디오, 잡지, 신문)를 중심으로 최대한 많은 사람들에게 브랜드와
brunch.co.kr