노트

JWT

JSON Web Token

백엔드#security#http · 연결된 개념 13개

쉽게 말하면

JWT는 발행처 도장이 찍힌 자유이용권 같아요. 놀이기구마다 명단을 뒤질 필요 없이 도장이 진짜인지만 보면 되니, 서버가 로그인 상태를 따로 저장하지 않아도 되죠.

비유의 한계 이용권 내용은 봉인된 게 아니라 누구나 읽을 수 있어서 비밀을 넣으면 안 돼요. 또 한번 나눠 준 건 회수가 어려워서 만료를 짧게 두고 리프레시 토큰을 따로 둬요.

header.payload.signature 세 조각을 Base64URL로 인코딩해 이은 토큰. 서버는 서명만 검증하면 되므로 세션 저장소 없이(무상태, stateless) 인증할 수 있다.

  • payload는 암호화가 아니라 인코딩이다. 누구나 읽을 수 있으니 비밀을 넣지 않는다
  • 발급한 토큰은 서버가 취소하기 어렵다. 만료를 짧게 두고 리프레시 토큰(refresh token)을 따로 둔다
  • 스프링에서는 필터체인에 검증 필터를 끼워 SecurityContext에 인증 정보를 채운다
  • 저장 위치(localStorage냐 httpOnly 쿠키냐)는 XSS(Cross-Site Scripting)와 CSRF(Cross-Site Request Forgery) 위험을 맞바꾸는 선택이다 → 세션 인증와 비교
  • 리프레시 토큰 회전(rotation): 리프레시할 때마다 새 리프레시 토큰을 주고 이전 것은 폐기한다. 탈취된 토큰이 재사용되면 감지할 수 있다. DRF의 simplejwt는 ROTATE_REFRESH_TOKENS·BLACKLIST_AFTER_ROTATION 설정으로 지원한다(DRF 인증과 권한)
  • DB에 저장하는 일반 토큰은 행을 지우면 즉시 차단되지만, JWT는 만료 전까지 막으려면 차단 목록(denylist)을 따로 조회해야 해서 stateless의 장점이 줄어든다

책: 10장. JWT로 인증하기 · 10장. 해시, 암호화, 인코딩은 무엇이 다를까

출처: RFC 7519: JSON Web Token · RFC 9700: Refresh Token Protection · Simple JWT 설정: ROTATE_REFRESH_TOKENS

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 요청 제한 (Throttling)

    요청 제한(rate limiting, throttling)은 일정 시간 동안 한 클라이언트가 보낼 수 있는 요청 수를 묶어 두는 장치다. 한도를 넘으면 429 Too Many Requests로 거절하고, 보통 Retry-After 헤더로 언제 다시 시도하면 되는지 알려 준다.

  • 권한 있는 데이터(기준 데이터)

    권한 있는 데이터(authoritative data)는 어떤 값이 맞는지 판단할 때 최종 기준으로 삼기로 정한 데이터의 원천이다. 여러 곳에 같은 정보가 있고 값이 서로 다르면 권한 있는 쪽을 따르고, 나머지는 사본으로 다룬다. 데이터 관리에서는 이런 저장 시스템을 기록 시스템(System of Record, SoR)이라 부른다.

  • NestJS

    NestJS는 TypeScript를 전제로 모듈·의존성 주입(Dependency Injection, DI)·데코레이터(decorator) 구조를 제공하는 Node.js 서버 프레임워크다. 2017년 Kamil Myśliwiec가 만들었고, 구조를 강제하는 방식 때문에 흔히 "Node.js의 Spring"이라 불린다.

  • 자가 테스트 코드

    결과까지 스스로 판정하는 자동화된 테스트를 갖춘 코드. 사람이 출력을 눈으로 확인할 필요 없이 명령 하나로 "모두 통과"를 알 수 있어야 한다. 리팩터링의 전제 조건이다.

  • Django의 CSRF 방어

    Django는 CsrfViewMiddleware로 CSRF(Cross-Site Request Forgery)를 막는다. 기본 아이디어는 Double Submit Cookie, 즉 쿠키에 든 CSRF 값과 요청에 함께 보낸 값을 비교하는 것이고, 여기에 토큰 마스킹(token masking)과 Origin·Referer 검사를 더한다.

보기 옵션