본문 바로가기
IT/기타

[IT/Web] 쿠키 저장 정책(Set-Cookie, SameSite)

by 저당단 2025. 12. 11.

온프레미스 배포 환경(non-ssl)에서 쿠키 저장이 안 됐던 이유에 대해 정리.

브라우저 정책상 Secure가 false인 쿠키는 SameSite가 무조건 Lax, Strict여야 저장하기 때문에 Lax로 설정하였음.

1. 문제 상황

증상:

  1. /iam에서 로그인하면 쿠키 저장 안 됨
  2. 요청시 옵션에 credentials: "include" 를 넣으면 저장됨
  3. 백엔드를 nginx 설정으로 프록시하면 저장됨

2. 원인: cross-site라면 Set-Cookie 무시

먼저 브라우저가 “same-site” 로 판단하려면 scheme + host + port가 모두 같아야 함.

192.168.0.60:80   → Site A
192.168.0.60:9100 → Site B

현재 위와 같이 포트가 다른 상황이기 때문에 cross-site로 취급되었음.

cross-site면 서버의 Set-Cookie 응답을 무시하여, 브라우저에 쿠키가 저장되지 않음.

하지만 cross-site일 때도 Set-Cookie를 붙여주는 옵션이 있는데 그게 바로 credential: "include" 인 것.

 

일단 Set-Cookie 응답만 오면 cross-site라도 같은 Domain일 경우 브라우저에 저장됨.

Domain은 위처럼 IP일 수도 있음.


3. 보편적 해결책: nginx 프록시로 origin 통일하기

location /iam/api/ {
    proxy_pass http://192.168.0.60:9100/;
    proxy_set_header Host $host;
}

이 경우 프론트, 백엔드가 같은 Origin이 되어 same-site를 충족함.

때문에 credential 옵션을 주지 않아도 쿠키 저장에 문제가 없어짐.

쿠키는 원래 same-site가 원칙이므로 이 방법이 좀더 권장됨.

credential 옵션을 넣어도 크롬을 제외한 다른 브라우저에선 안될 가능성이 있기 때문임. (크롬이 느슨한 편이라고 함)

 


4. 쿠키 SameSite 옵션

결국 SameSite가 Lax든 뭐든간에 쿠키가 브라우저에 저장되는 것과는 상관이 없었음.

SameSite는 자동으로 쿠키를 요청에 붙여줄지를 정하는 옵션임.

 

<요청시 브라우저에서 자동으로 쿠키를 붙여주는가?>

요청                                   SameSite=Strict SameSite=Lax  SameSite=None 
cross-site X GET / HEAD / OPTIONS만 O O
same-site O O O

 

사용자의 인증정보를 악용하는 공격 CSRF 취약점 때문에 필요한 옵션이다.