JWT (JSON Web Token)
한눈에 보기
JWT는 JSON 정보에 디지털 서명을 붙여 위조할 수 없는 자기 완결적 토큰으로 만든 웹 표준이다. 헤더, 페이로드, 서명의 구조와 검증 절차, 무효화 문제와 리프레시 토큰 전략, 저장 위치별 보안을 다룬다.
최종 업데이트 2026.09.17
JWT(JSON Web Token)는 JSON 형태의 정보에 디지털 서명을 붙여, 발급자 외에는 위조할 수 없는 자기 완결적(Self-contained) 토큰으로 만든 웹 표준이다. 서버는 토큰 안의 서명만 검증하면 별도 저장소 조회 없이 담긴 정보를 신뢰할 수 있으므로, 무상태(Stateless) 인증과 서비스 간 정보 전달에 널리 쓰인다. 다만 서명은 위조 방지 수단일 뿐 암호화가 아니며, 발급된 토큰을 즉시 무효화하기 어렵다는 한계를 정확히 알고 써야 한다.
구조: 헤더, 페이로드, 서명
JWT는 점으로 구분된 세 부분으로 이루어진 문자열이다. 각 부분은 URL에 안전한 Base64URL 방식으로 인코딩된다.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJzdWIiOiI0MiIsInJvbGUiOiJ1c2VyIiwiZXhwIjoxNzM1Njg5NjAwfQ
.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
첫 부분인 헤더(Header)는 서명 알고리즘과 토큰 유형을 담는다. 예를 들어 {"alg":"HS256","typ":"JWT"}이다. 둘째 부분인 페이로드(Payload)는 클레임(Claim)이라 부르는 정보 조각들의 집합이다. 표준 등록 클레임으로 발급자 iss, 대상 sub, 수신자 aud, 만료 시각 exp, 발급 시각 iat, 토큰 고유 식별자 jti 등이 있고, 역할이나 권한 같은 서비스 고유 클레임을 추가할 수 있다. 셋째 부분인 서명(Signature)은 인코딩된 헤더와 페이로드를 점으로 이은 문자열에 비밀 키로 서명 연산을 한 결과다. 페이로드가 한 글자라도 바뀌면 서명이 맞지 않으므로 위조가 드러난다. 중요한 것은 Base64URL이 암호화가 아니라 단순 인코딩이라는 점이다. 누구나 디코딩해 내용을 읽을 수 있으므로 비밀번호나 개인정보를 페이로드에 넣으면 안 된다.
서명 알고리즘과 검증 과정
서명 방식은 크게 두 계열이다. HS256 같은 HMAC 계열은 발급자와 검증자가 같은 비밀 키를 공유하는 대칭 방식으로, 단일 서비스에서 간단하지만 키를 아는 쪽은 누구든 토큰을 만들 수 있다. RS256이나 타원 곡선 기반 ES256 같은 비대칭 방식은 개인 키로 서명하고 공개 키로 검증한다. 인증 서버만 개인 키를 갖고, 여러 API 서버는 공개 키만으로 검증하면 되므로 마이크로서비스(Microservice) 환경에 적합하다. 공개 키 목록은 보통 JWKS(JSON Web Key Set)라는 표준 주소로 게시되어 검증 서버가 자동으로 받아 간다. 검증 절차는 다음 순서로 이루어진다. 먼저 토큰을 세 부분으로 나누고 헤더의 알고리즘이 서버가 허용한 알고리즘인지 확인한다. 이어 서명을 키로 검증하고, exp와 nbf로 유효 기간을, iss와 aud로 발급자와 수신 대상을 확인한다. 알고리즘 확인을 빼먹으면 서명 없음을 뜻하는 none 알고리즘이나 대칭과 비대칭 혼동을 악용한 공격에 뚫릴 수 있으므로, 검증 라이브러리에 허용 알고리즘을 명시적으로 고정하는 것이 필수다.
세션 방식과의 비교와 무효화 문제
| 구분 | 세션 | JWT |
|---|---|---|
| 상태 저장 | 서버 저장소 | 토큰 자체에 포함 |
| 검증 방법 | 저장소 조회 | 서명 검증 연산 |
| 서버 확장 | 공유 저장소 필요 | 키만 공유하면 된다 |
| 즉시 무효화 | 저장소에서 삭제하면 끝 | 기본적으로 불가 |
| 담을 수 있는 정보 | 제한 없음 | 크기 부담과 노출 위험 고려 |
JWT의 최대 약점은 무효화다. 서버가 상태를 갖지 않는 대가로, 유효 기간이 남은 토큰은 로그아웃이나 권한 회수 후에도 계속 통과된다. 실무의 표준 해법은 토큰 이원화다. 액세스 토큰(Access Token)의 수명을 수분에서 수십 분으로 짧게 잡고, 수명이 긴 리프레시 토큰(Refresh Token)을 서버가 추적 가능한 형태로 보관하며 재발급 시점에 차단 여부를 판단한다. 리프레시 토큰을 재발급 때마다 교체하는 회전(Rotation)을 적용하면 탈취된 토큰의 재사용을 탐지할 수 있다. 그 밖에 jti 기반의 차단 목록(Denylist)을 두는 방법도 있지만, 이는 결국 상태 저장을 다시 도입하는 것이므로 무상태의 이점과 맞바꾸는 절충임을 이해해야 한다.
저장 위치와 보안 수칙
브라우저에서 토큰을 어디에 둘지는 공격 표면의 선택 문제다. 로컬 스토리지(localStorage)는 구현이 쉽지만 XSS(Cross Site Scripting)에 성공한 스크립트가 토큰을 그대로 읽어 갈 수 있다. HttpOnly 쿠키에 담으면 스크립트가 읽을 수 없어 XSS에 강해지지만, 쿠키 자동 전송 특성 때문에 CSRF(Cross Site Request Forgery) 대비가 필요하며 SameSite 속성으로 보완한다. 어느 쪽이든 액세스 토큰 수명을 짧게 유지하는 것이 피해를 줄이는 공통 전제다. 이 밖에 페이로드에 민감 정보 금지, 충분히 긴 서명 키 사용, HTTPS 강제, 만료와 발급자 검증 생략 금지가 기본 수칙이다.
면접에서 이렇게 물어본다
- JWT의 세 부분 구조와 각 부분의 역할을 설명해 보라.
- 서명이 위조를 막는 원리와, 서명이 암호화와 다른 이유를 말해 보라.
- HS256과 RS256의 차이, 그리고 마이크로서비스에서 비대칭 방식이 선호되는 이유는 무엇인가.
- JWT 로그아웃 처리의 어려움과 리프레시 토큰 회전 전략을 설명해 보라.
- 토큰을 로컬 스토리지와 HttpOnly 쿠키 중 어디에 저장하겠는가. 근거를 들어 보라.
웹에서 같이 읽기
- 웹 인증 방식 총정리 (Authentication)웹 서비스의 인증은 요청을 보낸 사용자가 누구인지 확인하는 절차다. HTTP는 무상태 프로토콜이므로 로그인 이후 요청마다 사용자를 식별할 수단이 필요하며, 세션, 토큰, API 키, OAuth를 비교해 각 방식의 적합한 상황을 정리한다.
- 쿠키와 세션 (Cookie, Session)쿠키는 서버가 브라우저에 저장하도록 지시하는 작은 키와 값의 쌍이고, 세션은 쿠키를 운반 수단으로 삼아 사용자별 상태를 서버 저장소에 보관하는 기법이다. 두 개념의 동작 원리와 보안 속성, 위협 대응을 다룬다.
- CSR과 SSR (Client Side Rendering, Server Side Rendering)CSR은 브라우저가 자바스크립트로 화면을 그리는 방식, SSR은 서버가 완성된 HTML을 내려보내는 방식이다. 초기 로딩, SEO, 서버 부하 관점의 차이와 SSG, ISR을 포함한 혼합 전략까지 정리한다.
- CSRF와 XSS (Cross Site Request Forgery, Cross Site Scripting)XSS는 공격자의 스크립트를 피해자 브라우저에서 실행시키는 공격이고, CSRF는 로그인된 브라우저를 속여 피해자 명의의 요청을 보내는 공격이다. 두 공격이 악용하는 신뢰 관계의 차이와 방어 수단을 정리한다.
이 개념, 내 코드에서는 어떻게 물어볼까요
데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.
공고 넣고 시작하기