세션/쿠키가 유지되지 않을 때 체크리스트

로그인이 풀리거나 쿠키가 안 붙을 때: SameSite/Secure/Domain/프록시/CORS를 한 번에 점검


“로그인이 계속 풀린다”, “브라우저에서만 인증이 안 된다”는 대부분 쿠키 속성 또는 프록시/HTTPS 인식 문제입니다.

관련 용어: Cookie, Session, SameSite

1) 가장 먼저 볼 것 (브라우저 DevTools)

  1. 로그인 응답의 Set-Cookie가 실제로 내려오는가? (Network 탭)
  2. 쿠키가 저장됐는가? (Application/Storage → Cookies)
  3. 이후 요청에 Cookie 헤더가 붙는가? (Network 탭)

2) 쿠키 속성 체크리스트

  • Domain: 서브도메인 간 공유가 필요한가? 필요 없다면 지정하지 않는 것이 안전합니다.
  • Path: /가 아닌 경우, 특정 경로에서만 전송됩니다.
  • Secure: HTTPS에서만 전송됩니다. (로컬 HTTP에서 테스트하면 안 붙을 수 있음)
  • HttpOnly: JS에서 접근 불가(권장). 단, 디버깅은 DevTools로 확인합니다.
  • SameSite:
    • 기본값은 브라우저별로 달라질 수 있으며, 크로스 사이트 요청에서 특히 중요합니다.
    • SameSite=None은 반드시 Secure가 함께 필요합니다.

3) 프론트 요청 옵션 체크리스트

  • fetch: credentials: "include"가 필요한가?
  • axios: withCredentials: true가 필요한가?
  • CORS에서 Access-Control-Allow-Credentials: true를 쓰는가?
  • Access-Control-Allow-Origin: *credentials는 같이 쓸 수 없는 경우가 많습니다.

관련 문서: CORS 트러블슈팅 가이드

4) 프록시(nginx) 뒤에서 특히 흔한 문제

  • 외부는 HTTPS인데 앱이 HTTP로 인식하면, “Secure 쿠키 발급”이 꼬입니다.
  • 이 경우 프레임워크별로 trust proxy 또는 X-Forwarded-Proto 신뢰 설정이 필요합니다.

5) 추천 기본값 (대부분의 서비스)

  • 같은 사이트 내 로그인 유지: HttpOnly; Secure; SameSite=Lax
  • “다른 사이트에서 우리 API를 호출”하는 구조(예: 임베드/서드파티): SameSite=None; Secure 필요 가능

같이 보면 좋은 문서

관련 가이드