노트JWT
JSON Web Token
백엔드#security#http · 연결된 개념 10개
쉽게 말하면
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로 인증하기
출처: 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 헤더로 언제 다시 시도하면 되는지 알려 준다.
- NestJS
NestJS는 TypeScript를 전제로 모듈·의존성 주입(Dependency Injection, DI)·데코레이터(decorator) 구조를 제공하는 Node.js 서버 프레임워크다. 2017년 Kamil Myśliwiec가 만들었고, 구조를 강제하는 방식 때문에 흔히 "Node.js의 Spring"이라 불린다.
- 스프링 REST 컨트롤러
@RestController는 메서드의 반환값을 뷰 이름이 아니라 HTTP 응답 본문(보통 JSON)으로 쓰는 컨트롤러다. @Controller에 @ResponseBody를 합친 것으로, 직렬화(serialization)는 Jackson이 맡는다.
- 자가 테스트 코드
결과까지 스스로 판정하는 자동화된 테스트를 갖춘 코드. 사람이 출력을 눈으로 확인할 필요 없이 명령 하나로 "모두 통과"를 알 수 있어야 한다. 리팩터링의 전제 조건이다.
- Django의 CSRF 방어
Django는 CsrfViewMiddleware로 CSRF(Cross-Site Request Forgery)를 막는다. 기본 아이디어는 Double Submit Cookie, 즉 쿠키에 든 CSRF 값과 요청에 함께 보낸 값을 비교하는 것이고, 여기에 토큰 마스킹(token masking)과 Origin·Referer 검사를 더한다.