🟩/HTTP

Cookie

진뚱이용 2024. 6. 11. 01:13

new

Cookie cookie = new Cookie(name, value);
  • String, String 형태로 저장한다
  • 같은 name이면 덮어씌어진다

MaxAge

cookie.setMaxAge(0);
  • 기본적으로 쿠키는 브라우저를 종료하고 열어도 유지한다
  • 브라우저가 쿠키 저장소 청소를 일정 시기마다 한다
  • -1 "세션 쿠키"
    • 브라우저를 완전히 종료하면 세션 쿠키는 삭제된다
    • 하지만 브라우저 탭만 종료하면 삭제되지 않는다
  • 0
    • 쿠키를 삭제하는 것이 아닌 만료를 시키는 것이다
    • 브라우저가 요청을 보낼때 쿠키를 서버로 전송하지 않는다
  • 1 (second 단위)
    • 1초 후에 만료된다

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여야 함)
  • 기본값은 ‘Lax’ 이다

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 헤더가 서버로부터 응답에 포함될 때 발생한다.
  • 단, 브라우저 설정이나 사용자 환경에 따라 쿠키 저장이 차단될 수는 있다.