Session Cookie JWT Token
3줄 요약
- Session, Cookie, JWT, Token은 같은 말이 아니다. Session은 서버 인증 상태, Cookie는 브라우저 저장/전송 수단, JWT는 서명된 claim 표현, Token은 bearer credential이다.
- 공격자는 탈취한 세션 ID나 token을 재사용하고, JWT 검증 누락과 refresh token 회전 실패를 이용해 인증 상태를 유지하려 한다.
- 방어는 저장 위치, 검증 조건, 만료 시간, 회전, 폐기, 로그를 token 생명주기로 함께 설계하는 것이다.
핵심 정리
- Cookie는 브라우저가 자동 전송한다. 편리하지만 CSRF와 cookie scope 설정 실수까지 함께 고려해야 한다.
HttpOnly는 JavaScript 접근을 줄이고, Secure는 HTTPS 전송을 요구하며, SameSite는 cross-site 전송을 제한한다. 세 속성은 서로 대체하지 않는다.
- JWT header와 payload는 Base64URL 인코딩일 뿐 암호화가 아니다. 민감 정보, 권한 변경에 즉시 반영되어야 하는 정보, 긴 수명의 비밀을 넣지 않는다.
- JWT 검증은 서명만 보는 것이 아니다.
iss, aud, exp, nbf, alg, typ, kid, key source, clock skew를 함께 본다.
- Access token은 짧게 유지하고, refresh token은 더 강한 저장소와 회전, 재사용 탐지, token family 폐기로 다룬다.
- Logout은 클라이언트 저장소 삭제가 아니다. 서버 세션, refresh token, token family, 고위험 access token의 남은 유효 기간까지 고려해야 한다.
하위 문서 연결
-
- Session과 Cookie 보안 모델: 쿠키 scope, 자동 전송, CSRF,
__Host- prefix, 세션 ID 노출 위험을 다룬다.
-
- JWT 구조와 검증: JWT의 header/payload/signature와 필수 검증 항목, 알고리즘 혼동, audience 혼동을 다룬다.
-
- Access Token Refresh Token 설계: access token과 refresh token의 수명, 저장소, rotation, reuse detection을 나눈다.
-
- Token 저장 위치와 탈취 위험: localStorage, memory, HttpOnly Cookie, 모바일 secure storage, BFF 패턴의 위험을 비교한다.
-
- Logout Revocation Rotation: logout, password change, 계정 잠금, refresh token 재사용 탐지 때 무엇을 폐기할지 정한다.
헷갈리는 지점
- JWT를 쓰면 서버 상태가 전혀 필요 없다고 생각하기 쉽다. access token 검증은 서버 조회 없이 가능하기 때문이다.
- 핵심은 refresh token, revocation, 권한 변경, 사고 대응에는 서버 상태가 필요할 수 있다는 점이다.
- 완전 무상태라는 말보다 “어떤 상태를 어디에 둘 것인가”를 먼저 정해야 한다.
- Cookie는 안전하고 localStorage는 무조건 위험하다고만 외우기 쉽다.
- 핵심은 XSS, CSRF, 자동 전송, JavaScript 접근성, 폐기 가능성을 비교하는 것이다.
- HttpOnly Cookie도 CSRF와 scope 설정을 잘못하면 위험하다.
- JWT payload를 서버가 만들었으니 계속 믿어도 된다고 생각하기 쉽다.
- 핵심은 token 발급 이후 계정 상태와 권한이 바뀔 수 있다는 점이다.
- 긴 수명의 권한 claim은 권한 강등과 탈취 대응을 어렵게 만든다.
- Logout 버튼을 누르면 인증이 끝난다고 생각하기 쉽다.
- 핵심은 사용자의 브라우저 저장소와 서버의 유효 상태가 모두 끊겨야 한다는 점이다.
- 탈취된 access token은 만료 전까지 남을 수 있으므로 TTL과 revocation 전략을 같이 본다.
확인 질문
- Cookie와 Token의 차이는 무엇인가?
- Cookie는 브라우저 저장과 자동 전송 방식이고, token은 인증/인가 주장을 담는 bearer credential이다.
- JWT 검증에서 서명 외에 확인해야 할 것은 무엇인가?
- issuer, audience, expiry, not before, algorithm allowlist, key id, token type, clock skew다.
- Refresh token이 access token보다 더 조심스러운 이유는 무엇인가?
- 새 access token을 계속 발급할 수 있어 탈취 시 장기 세션 유지 수단이 되기 때문이다.
- Logout 설계에서 반드시 정해야 할 것은 무엇인가?
- 클라이언트 삭제, 서버 세션 폐기, refresh token 폐기, token family 폐기, access token 잔여 수명 처리다.