new
Cookie cookie = new Cookie(name, value);
- String, String 형태로 저장한다
- 같은 name이면 덮어씌어진다
MaxAge
cookie.setMaxAge(0);
- 기본적으로 쿠키는 브라우저를 종료하고 열어도 유지한다
- 브라우저가 쿠키 저장소 청소를 일정 시기마다 한다
- -1 "세션 쿠키"
- 브라우저를 완전히 종료하면 세션 쿠키는 삭제된다
- 하지만 브라우저 탭만 종료하면 삭제되지 않는다
- 0
- 쿠키를 삭제하는 것이 아닌 만료를 시키는 것이다
- 브라우저가 요청을 보낼때 쿠키를 서버로 전송하지 않는다
- 1 (second 단위)
Path
cookie.setPath(cookiePath);
- 쿠키가 전송될 수 있는 서버 경로를 지정한다
- '/app' 이면 '/app'과 '/app/profile' 등의 요청에만 쿠키를 서버에 전송한다
Secure
cookie.setSecure(cookieSecure);
- HTTPS 같은 보안 연결을 통해서만 전송되어야 하는지 여부를 설정한다
- 중간자 공격을 방지한다
HttpOnly
cookie.setHttpOnly(cookieHttpOnly);
- 클라이언트 측 스크립트 언어(예:JavaScript)는 접근할 수 없다
- XSS(크로스 사이트 스크립팅) 공격을 통한 쿠키의 접근을 방지한다
Domain
cookie.setDomain(cookieDomain);
- 쿠키가 유효한 도메인을 지정하는 속성이다.
- 쿠키를 설정할 때, 특정 도메인과 그 하위 도메인에서만 쿠키가 전송되도록 설정할 수 있다.
- 기본값은 쿠키가 생성된 도메인이다.
SameSite
// SameSite 설정을 추가하려면 쿠키 헤더를 직접 조작
String cookieHeader = String.format("%s; SameSite=%s", cookie.toString(), "Strict");
response.addHeader("Set-Cookie", cookieHeader);
- 크로스 사이트 요청에서 쿠키가 전송되는 방식을 제어한다.
- 호스트 이름만으로 동일 사이트 여부를 판단한다.
- CSRF 공격을 방지하기 위해 사용된다.
|
Strict |
Lax |
None |
동일 사이트 요청 |
쿠키 전송 |
쿠키 전송 |
쿠키 전송 |
크로스 사이트 요청 |
쿠키 전송 안됨 |
GET 방식의 탑 레벨 네비게이션(링크 클릭, URL 직접 입력)에서는 쿠키 전송. 다른 요청(POST 등)에서는 쿠키 전송 안됨. |
쿠키 전송 (단 Secure = True여야 함) |
org.springframework.http.ResponseCookie
- SameSite 속성과 같은 최신 웹 표준을 직접 지원
- jakarta.servlet.http.Cookie는 직접 작성해야 함
퍼스트 파티 쿠키
- 사용자가 방문한 웹사이트의 도메인에서 설정한 쿠키이다.
- 사용자가 특정 웹사이트를 방문할 때, 해당 웹사이트의 서버가 직접 설정한 쿠키를 의미한다.
- 주로 사용자 세션 관리, 사용자 설정 저장, 분석 등에 사용된다.
- 기본적으로 사용자가 방문한 동일한 도메인 내에서 사용되므로, SameSite 속성의 영향이 적다.
서드 파티 쿠키
- 사용자가 방문한 웹사이트가 아닌 다른 도메인에서 설정한 쿠키이다.
- 사용자가 example.com 을 방문했을 때, example.com 페이지에 포함된 광고가 adnetwork.com 에서 설정한 쿠키
- 주로 광고, 트래킹, 제휴 마케팅에 사용된다.
- 최근 브라우저들은 프라이버시 보호를 위해 서드 파티 쿠키에 대한 제약을 강화하고 있다.
- 크롬과 파이어폭스는 기본적으로 서드 파티 쿠키를 차단하는 옵션을 제공한다.
- 크로스 사이트 요청에서 주로 사용되므로, SameSite 속성이 중요한 역할을 한다.
상황 별 시나리오
프론트 주소 |
백엔드 주소 |
쿠키 도메인 |
SameSite |
쿠키 저장 여부 |
쿠키 전송 여부 |
이유 |
실제 테스트 |
localhost:443 |
localhost:8080 |
localhost |
Strict |
O |
O |
same-site |
|
localhost:443 |
localhost:8080 |
localhost |
None |
O |
O |
None |
저장 O, 전송 O |
localhost:443 |
pasds.world:8080 |
pasds.world |
Strict |
O |
X |
cross-site |
저장 O, 전송 X |
localhost:443 |
pasds.world:8080 |
pasds.world |
None |
O |
O |
None |
|
pasds.world:443 |
localhost:8080 |
localhost |
Strict |
O |
X |
cross-site |
|
pasds.world:443 |
localhost:8080 |
localhost |
None |
O |
O |
None |
|
pasds.world:443 |
pasds.world:8080 |
pasds.world |
Strict |
O |
O |
same-site |
저장 O, 전송 O |
pasds.world:443 |
pasds.world:8080 |
pasds.world |
None |
O |
O |
None |
저장 O, 전송 O |
- 쿠키는 클라이언트 측(즉, 사용자의 브라우저)에 항상 저장된다.
- 쿠키를 설정하는 Set-Cookie 헤더가 서버로부터 응답에 포함될 때 발생한다.
- 단, 브라우저 설정이나 사용자 환경에 따라 쿠키 저장이 차단될 수는 있다.