Unisquads
로그인
홈
이용약관·개인정보처리방침·콘텐츠정책·© 2026 Unisquads
이용약관·개인정보처리방침·콘텐츠정책
© 2026 Unisquads. All rights reserved.

JWT (r1)

이 문서의 과거 버전 (r1)을 보고 있습니다. 수정일: 2026.02.14 23:11

JWT

이름

JWT (JSON Web Token)

분류

웹 표준 / 인증 기술

표준

RFC 7519

주요 용도

인증(Authentication), 권한 부여(Authorization), 정보 교환

형식

Header.Payload.Signature (점으로 구분된 세 부분)

서명 알고리즘

HMAC, RSA, ECDSA 등

기술 상세

구성 요소

Header (타입/알고리즘), Payload (클레임 데이터), Signature (서명)

클레임 종류

등록 클레임(Registered), 공개 클레임(Public), 비공개 클레임(Private)

특징

자기 포함적(Self-contained), Stateless, 컴팩트함, URL-Safe

전송 방식

HTTP Authorization 헤더, URL 쿼리 파라미터, Cookie 등

보안 고려사항

서명 검증 필수, 민감 정보 저장 지양, 토큰 유효기간 설정

대안/관련 기술

OAuth 2.0, SAML, Session-Based 인증

주요 라이브러리

java-jwt, jsonwebtoken, pyjwt 등 다양한 언어 지원

단점

토큰 크기 증가 가능성, 취소/폐기 어려움(별도 메커니즘 필요)

1. 개요

JWT(JSON Web Token)는 당사자 간 정보를 JSON 객체로 안전하게 전송하기 위한 개방형 표준(RFC 7519)이다. 이 정보는 디지털 서명을 통해 검증 가능하며 신뢰할 수 있다. JWT는 HMAC 알고리즘을 사용하는 비밀키 또는 RSA나 ECDSA를 사용하는 공개/개인 키 쌍으로 서명할 수 있다.

JWT는 주로 인증과 권한 부여에 널리 사용된다. 사용자가 로그인하면 서버는 사용자의 신원을 증명하는 JWT를 생성하여 반환한다. 이후 사용자는 이 토큰을 보유하고, 보호된 경로나 API에 접근할 때마다 해당 토큰을 첨부하여 전송한다. 이 방식은 상태 비저장인 RESTful API 환경과 잘 어울린다.

JWT는 점(.)으로 구분된 세 부분으로 구성된다. 각 부분은 헤더, 페이로드, 서명이며, 이 구조는 토큰의 생성과 검증 과정을 표준화한다. 토큰 자체에 필요한 정보를 포함하기 때문에 데이터베이스 조회 없이도 신원을 확인할 수 있다는 특징을 가진다.

구분

설명

용도

인증, 권한 부여, 정보 교환

형식

점(.)으로 구분된 Base64Url 인코딩 문자열

특징

자기 포함적, 경량, 웹 표준

표준

IETF의 RFC 7519

JWT는 단일 사인온 시스템, 서버 간 통신, 모바일 애플리케이션 등 다양한 현대 웹 아키텍처에서 핵심적인 역할을 한다.

2. JWT의 구조

JWT는 점('.')으로 구분된 세 부분, 즉 헤더, 페이로드, 서명으로 구성된다. 이 세 부분은 각각 Base64Url 인코딩되어 있으며, 이를 이어붙여 하나의 문자열 형태로 표현된다. 최종적인 JWT 형식은 헤더.페이로드.서명의 구조를 가진다.

첫 번째 부분인 헤더는 일반적으로 두 가지 정보를 담는다: 토큰의 유형(typ)과 서명 생성에 사용된 암호화 알고리즘(alg)이다. 가장 일반적인 유형은 "JWT"이며, 알고리즘으로는 HMAC SHA256 또는 RSA가 자주 사용된다. 이 정보는 JSON 객체로 정의된 후 Base64Url로 인코딩되어 JWT의 첫 번째 세그먼트를 형성한다.

두 번째 부분인 페이로드는 실제 전달하려는 정보인 클레임을 포함한다. 클레임은 이름/값 쌍으로 이루어지며, 등록된 클레임, 공개 클레임, 비공개 클레임 세 가지 유형으로 나뉜다. 등록된 클레임은 미리 정의된 권장 클레임으로, 토큰 발급자(iss), 주제(sub), 수신자(aud), 만료 시간(exp), 발행 시간(iat) 등이 있다. 이들은 필수 사항은 아니지만 상호 운용성을 위해 사용된다. 공개 클레임은 충돌을 방지할 수 있는 이름으로 정의되며, 비공개 클레임은 사용자 정의 클레임으로 당사자 간에 합의된 정보를 교환하는 데 사용된다.

세 번째이자 마지막 부분인 서명은 인코딩된 헤더, 인코딩된 페이로드, 비밀 키(또는 공개/개인 키 쌍), 그리고 헤더에 지정된 알고리즘을 사용하여 생성된다. 서명의 목적은 메시지가 전송 과정에서 변경되지 않았음을 검증하고, JWT의 발신자가 누구인지 확인하는 것이다. 서명이 검증에 실패하면 토큰은 신뢰할 수 없는 것으로 간주된다.

구성 요소

설명

주요 내용 예시

인코딩 방식

헤더(Header)

토큰의 메타데이터

토큰 유형(typ), 알고리즘(alg)

Base64Url

페이로드(Payload)

전달할 데이터(클레임)

발급자(iss), 만료 시간(exp), 사용자 ID

Base64Url

서명(Signature)

무결성 및 인증 검증용

헤더와 페이로드를 조합하여 생성

헤더에 명시된 알고리즘(HMAC, RSA 등)

2.1. 헤더

JWT 헤더는 토큰의 첫 번째 부분을 구성하며, 토큰의 메타데이터를 담고 있다. 일반적으로 토큰의 유형과 서명에 사용된 암호화 알고리즘을 명시한다. 이 정보는 Base64Url 인코딩되어 JSON 객체 형태로 저장된다.

헤더의 가장 일반적인 구조는 다음과 같다.

필드

설명

예시 값

alg

서명 알고리즘(Algorithm). 토큰의 서명을 생성하고 검증하는 데 사용할 알고리즘을 지정한다.

HS256, RS256, none

typ

토큰 유형(Type). 토큰의 종류를 나타내며, JWT임을 명시하기 위해 JWT로 고정된다.

JWT

cty

콘텐츠 유형(Content Type). 주로 중첩된 JWT를 나타낼 때 사용되며, 일반적인 JWT에서는 생략된다.

JWT

alg 필드는 필수 항목으로, 서명 방식을 결정한다. HS256은 대칭 키 방식을, RS256은 비대칭 키 방식을 사용한다는 것을 의미한다. none 값은 서명이 없음을 나타내며, 보안상의 이유로 사용이 제한된다. 헤더는 서명 과정에 직접적으로 관여하여, 검증자가 올바른 알고리즘으로 서명을 확인할 수 있도록 한다.

2.2. 페이로드

페이로드는 JWT의 두 번째 부분으로, 토큰이 전달하려는 실제 데이터를 담고 있다. 이 데이터 조각들을 클레임이라고 부르며, 주로 사용자 정보나 권한, 토큰 자체의 메타데이터를 포함한다. 페이로드는 Base64Url 인코딩되어 있지만, 암호화되지 않기 때문에 민감한 정보를 저장해서는 안 된다.

클레임은 등록된 클레임, 공개 클레임, 비공개 클레임 세 가지 유형으로 구분된다. 등록된 클레임은 미리 정의된 표준 필드로, 선택적으로 사용할 수 있다. 주요 등록된 클레임은 다음과 같다.

클레임

설명

예시

sub

주체(Subject) - 토큰의 주인(사용자 ID)

"sub": "user123"

exp

만료 시간(Expiration Time) - 토큰의 유효 기간

"exp": 1735689600

iat

발급 시간(Issued At) - 토큰이 발급된 시간

"iat": 1735686000

iss

발급자(Issuer) - 토큰을 발급한 주체

"iss": "example.com"

공개 클레임은 충돌을 방지하기 위해 IANA에 등록되거나 URL 형식으로 정의되는 사용자 정의 클레임이다. 비공개 클레임은 통신 당사자 간에 합의하여 사용하는 사용자 정의 클레임으로, 예를 들어 "username": "john_doe"와 같은 형태를 가질 수 있다.

페이로드의 내용은 서명을 통해 변조 여부를 검증할 수 있지만, 누구나 디코딩하여 내용을 읽을 수 있다는 점을 명심해야 한다. 따라서 비밀번호나 신용카드 번호와 같은 절대적으로 보호되어야 하는 정보는 JWT 페이로드에 포함시키지 않는 것이 보안상 필수적이다.

2.3. 서명

서명은 JWT의 세 번째이자 마지막 부분으로, 토큰의 무결성과 신뢰성을 보장하는 핵심적인 역할을 한다. 서명은 헤더와 페이로드의 내용이 전송 중에 변조되지 않았음을 검증하기 위해 생성된다. 서버는 비밀 키 또는 공개/개인 키 쌍을 사용하여 서명을 생성하며, 이 서명 없이는 토큰의 내용을 임의로 변경할 수 없다.

서명 생성 과정은 다음과 같다. 먼저, Base64Url로 인코딩된 헤더와 페이로드를 점('.')으로 연결하여 서명 대상 문자열을 만든다. 그런 다음, 헤더에 지정된 암호화 알고리즘 (예: HMAC SHA256, RSA, ECDSA)과 비밀 키(또는 개인 키)를 사용하여 이 문자열에 대한 서명을 계산한다. 최종적으로 생성된 서명 역시 Base64Url 인코딩되어 헤더와 페이로드 뒤에 점으로 구분되어 추가된다.

구성 요소

설명

예시 알고리즘

서명 대상

인코딩된 헤더 + '.' + 인코딩된 페이로드

-

서명 알고리즘

서명을 생성하는 데 사용되는 암호화 방식

HS256, RS256, ES256

서명 키

알고리즘에 따라 사용되는 비밀 키 또는 개인 키

대칭 키(HMAC), 비대칭 키 쌍(RSA)

토큰을 검증할 때는 수신 측(보통 서버)이 동일한 알고리즘과 적절한 키(비밀 키 또는 발행자의 공개 키)를 사용하여 헤더와 페이로드로부터 서명을 다시 계산한다. 새로 계산한 서명 값이 토큰에 포함된 서명 값과 일치하면, 토큰이 유효하고 변조되지 않았다고 판단한다. 이 과정을 통해 JWT는 자기 포함적(self-contained) 특성을 유지하며, 별도의 저장소 조회 없이도 토큰 자체로 신뢰성을 입증할 수 있다.

3. JWT의 작동 원리

JWT의 작동 원리는 크게 토큰 생성, 전송, 검증의 세 단계로 나뉜다. 이 과정은 클라이언트와 서버 간의 무상태(stateless) 통신을 가능하게 하는 핵심 메커니즘이다.

먼저, 토큰 생성 단계에서 서버는 사용자의 인증 정보를 확인한 후 JWT를 발급한다. 서버는 미리 정의된 헤더와 페이로드 정보를 Base64Url로 인코딩하고, 지정된 비밀 키 또는 공개 키/개인 키 쌍을 사용해 이 둘을 결합하여 서명을 생성한다. 최종적으로 '헤더.페이로드.서명' 형식의 문자열이 완성되어 클라이언트에게 전달된다. 이 토큰은 클라이언트 측에서 보관되며, 주로 로컬 스토리지나 쿠키에 저장된다.

토큰 전송 및 검증 단계에서는 클라이언트가 서버에 API 요청을 할 때마다, 일반적으로 Authorization HTTP 헤더의 Bearer 스키마를 사용해 JWT를 함께 전송한다. 서버는 요청을 받으면 다음 과정으로 토큰의 유효성을 검증한다.

1. 서명 검증: 전달받은 서명 부분을 서버의 비밀 키 또는 공개키로 검증하여 토큰이 변조되지 않았는지 확인한다.

2. 클레임 검사: 페이로드에 포함된 클레임을 확인한다. 주요 검사 항목은 다음과 같다.

검사 항목

설명

exp (만료 시간)

토큰의 유효 기간이 지났는지 확인한다.

iss (발행자)

토큰 발행자가 신뢰할 수 있는 주체인지 확인한다.

aud (대상자)

토큰이 현재 서비스를 대상으로 발급된 것인지 확인한다.

검증에 성공하면 서버는 페이로드에 담긴 정보(예: 사용자 ID)를 신뢰하고 요청을 처리한다. 이 방식은 서버가 별도로 세션 상태를 유지할 필요가 없어 확장성이 뛰어나다. 그러나 토큰이 탈취당하면 유효기간 내에는 악용될 수 있으므로, HTTPS 사용과 짧은 만료 시간 설정 같은 보안 조치가 필수적이다.

3.1. 토큰 생성

토큰 생성은 JWT를 발급하는 첫 번째 단계이다. 이 과정은 일반적으로 인증 서버나 애플리케이션의 백엔드에서 수행된다. 생성 절차는 헤더와 페이로드를 정의하고, 이를 서명하여 최종 토큰 문자열을 조합하는 방식으로 이루어진다.

먼저, 헤더와 페이로드 객체를 생성한다. 헤더에는 토큰 유형(JWT)과 사용된 서명 알고리즘(예: HMAC SHA256 또는 RSA)을 명시한다. 페이로드에는 클레임(claim)이라 불리는 정보 조각들을 담는다. 클레임은 등록된(registered) 클레임, 공개(public) 클레임, 비공개(private) 클레임으로 구분된다. 등록된 클레임은 토큰의 발급자(iss), 만료 시간(exp), 대상자(aud) 등 미리 정의된 표준 필드를 포함한다.

다음으로, 생성된 헤더와 페이로드는 각각 Base64Url 인코딩을 거쳐 문자열로 변환된다. 이 두 문자열을 마침표(.)로 연결한 후, 서버가 보유한 비밀 키(Secret Key) 또는 개인 키(Private Key)를 사용해 지정된 알고리즘으로 서명을 생성한다. 최종적으로, 인코딩된 헤더, 페이로드, 그리고 이를 다시 Base64Url로 인코딩한 서명을 마침표로 연결하여 완전한 JWT 문자열을 생성한다. 이 문자열이 클라이언트에게 발급되는 토큰이다.

생성 단계

설명

출력 예 (일부)

1. 헤더 정의

알고리즘과 토큰 타입 지정

{"alg": "HS256", "typ": "JWT"}

2. 페이로드 정의

클레임(사용자 ID, 권한, 만료 시간 등) 설정

{"sub": "12345", "name": "John Doe", "exp": 1516239022}

3. Base64Url 인코딩

헤더와 페이로드를 각각 인코딩

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NSIsIm5hbWUiOiJKb2huIERvZSIsImV4cCI6MTUxNjIzOTAyMn0

4. 서명 생성

인코딩된 두 부분을 이어서 비밀키로 서명

SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

5. 토큰 조합

인코딩된 헤더.페이로드.서명을 결합

eyJhbGci...<중략>...SflKxw...

3.2. 토큰 전송

JWT는 생성된 후 일반적으로 HTTP 요청의 Authorization 헤더를 통해 전송됩니다. 가장 일반적인 방식은 'Bearer' 스키마를 사용하는 것으로, 헤더 값은 Bearer <토큰> 형식을 따릅니다. 이 방식은 RESTful API나 웹 애플리케이션에서 표준적으로 사용됩니다.

토큰을 전송하는 다른 방법으로는 URL 쿼리 매개변수나 POST 요청의 본문에 포함하는 방식이 있습니다. 그러나 URL 쿼리 매개변수에 포함할 경우, 서버 로그나 브라우저 히스토리에 토큰이 노출될 위험이 있어 보안상 권장되지 않습니다. 쿠키를 이용해 전송하는 방법도 있으나, CSRF 공격에 대한 추가적인 보호 장치가 필요합니다.

토큰 전송 시 중요한 보안 고려사항은 HTTPS를 통한 통신을 사용하는 것입니다. JWT 자체는 서명으로 무결성을 보장하지만, 전송 과정에서 제3자에 의해 탈취될 수 있기 때문입니다. 또한 클라이언트 측에서는 토큰을 안전하게 저장해야 하며, 로컬 스토리지나 세션 스토리지 사용 시 XSS 공격에 노출될 수 있다는 점을 인지해야 합니다.

3.3. 토큰 검증

JWT 검증은 수신한 토큰의 무결성과 신뢰성을 확인하는 과정이다. 이 과정은 주로 서버 측에서 수행되며, 토큰이 위조되거나 변조되지 않았는지, 그리고 유효한 클레임을 포함하는지 검사한다.

검증 절차는 일반적으로 다음 단계를 따른다.

1. 구조 확인: 토큰이 점(.)으로 구분된 헤더, 페이로드, 서명의 세 부분으로 구성되어 있는지 확인한다.

2. 서명 검증: 토큰 생성 시 사용된 비밀 키 또는 공개 키를 이용해 서명 부분을 재계산한다. 이렇게 계산한 서명 값이 토큰에 포함된 서명 값과 일치해야 한다. 서명 검증에 실패하면 토큰은 거부된다.

3. 클레임 검증: 페이로드에 포함된 표준 클레임을 기준으로 유효성을 판단한다. 주요 검증 항목은 다음과 같다.

검증 클레임

설명

exp (만료 시간)

토큰의 현재 시간이 exp 값보다 늦지 않아야 한다.

nbf (유효 시작 시간)

토큰의 현재 시간이 nbf 값보다 빠르지 않아야 한다.

iat (발급 시간)

일반적으로 발급 시간이 미래가 아니어야 한다.

iss (발급자)

토큰 발급자의 식별자가 예상된 값과 일치해야 한다.

aud (대상자)

토큰의 수신자 식별자가 자신(검증자)과 일치해야 한다.

검증이 성공하면, 서버는 페이로드에 포함된 사용자 정보나 권한(클레임)을 신뢰하고 이를 바탕으로 인가 결정을 내린다. 검증에 실패하면 토큰은 무효화되며, 요청은 거부된다. 이 검증 방식 덕분에 서버는 별도의 세션 저장소를 조회할 필요 없이 토큰 자체만으로 요청의 유효성을 빠르게 판단할 수 있다.

4. JWT의 장단점

JWT는 무상태성과 분산 시스템에서의 효율성이라는 명확한 장점을 가지지만, 토큰 자체의 특성에서 비롯된 몇 가지 단점과 보안상 주의해야 할 사항도 존재한다.

장점

JWT의 가장 큰 장점은 무상태성을 통해 서버의 확장성을 높인다는 점이다. 서버는 사용자 세션 정보를 별도로 저장할 필요 없이 토큰 자체에 포함된 클레임을 신뢰하고 처리할 수 있다. 이는 여러 대의 서버가 동일한 데이터베이스에 의존하지 않고도 독립적으로 요청을 처리할 수 있게 하여 수평적 확장을 용이하게 한다. 또한 구조가 단순하고 JSON 기반이므로 다양한 프로그래밍 언어와 플랫폼에서 쉽게 생성하고 검증할 수 있다. 페이로드에 필요한 정보를 자체적으로 담고 있어, 인증 후 추가적인 사용자 정보 조회를 위한 데이터베이스 호출을 줄일 수 있다는 점도 장점으로 꼽힌다.

단점 및 보안 고려사항

JWT의 주요 단점은 한번 발행되면 만료 시간 전까지는 취소가 어렵다는 점이다. 블랙리스트를 관리하는 중앙 집중식 메커니즘을 도입하지 않는 이상, 토큰을 강제로 무효화하기가 복잡해진다. 또한 토큰의 크기가 세션 식별자에 비해 상대적으로 크기 때문에, 매 요청마다 헤더에 포함되어 전송되면 네트워크 대역폭에 부담을 줄 수 있다. 가장 중요한 보안 고려사항은 토큰이 클라이언트 측에 저장된다는 점이다. 페이로드는 단순히 Base64Url로 인코딩된 것이므로, 중요한 비밀번호나 개인 키 같은 민감한 정보는 절대로 담아서는 안 된다. 또한 서명 검증을 철저히 하지 않으면, 토큰을 변조(위변조)하여 권한을 상승시키는 공격에 취약해질 수 있다. 적절한 만료 시간 설정과 HTTPS 통신 사용은 필수적인 보안 조치이다.

4.1. 장점

JWT는 무상태성을 기반으로 설계되어 서버 측에서 세션 정보를 저장할 필요가 없습니다. 이는 서버의 부하를 줄이고 확장성을 크게 향상시킵니다. 또한 여러 서비스나 도메인 간에 인증 정보를 손쉽게 공유할 수 있어 마이크로서비스 아키텍처나 분산 시스템 환경에 적합합니다.

토큰 자체(자체 포함 토큰)에 필요한 모든 정보를 포함하고 있어, 데이터베이스 조회 없이도 사용자 정보와 권한을 확인할 수 있습니다. 이는 인증 프로세스의 효율성을 높입니다. 표준화된 JSON 형식을 사용하기 때문에 다양한 프로그래밍 언어와 플랫폼에서 쉽게 생성하고 검증할 수 있습니다[1].

클라이언트 측에서 토큰을 저장하고 관리하기 때문에, 서버의 메모리나 스토리지 부담이 없습니다. 웹 애플리케이션과 모바일 애플리케이션 모두에서 일관된 인증 방식을 적용할 수 있습니다. 또한 서명을 통해 토큰의 무결성을 보장할 수 있어, 전송 중 변조 위험을 방지합니다.

4.2. 단점 및 보안 고려사항

JWT는 여러 장점에도 불구하고 잘못 사용하거나 구성할 경우 보안 취약점으로 이어질 수 있다. 주요 단점은 토큰 자체가 상태를 유지하지 않는 무상태성에서 비롯된다. 한번 발급된 JWT는 서버 측에서 강제로 만료시키기 어렵다. 이는 토큰이 탈취당했을 때 유효 기간이 만료될 때까지 악용될 수 있음을 의미한다. 따라서 JWT의 만료 시간은 신중하게 설정해야 한다.

페이로드에 저장된 정보는 암호화되지 않고 단순히 Base64로 인코딩되어 있기 때문에, 민감한 정보를 포함해서는 안 된다. 누구나 토큰을 디코딩하여 내용을 볼 수 있다. 또한, 서명 검증을 위한 비밀 키 또는 공개 키의 관리가 매우 중요하다. 키가 유출되면 공격자가 자유롭게 토큰을 위조할 수 있다.

주요 보안 고려사항은 다음과 같다.

고려사항

설명

완화 방안

토큰 탈취

XSS나 MITM 공격으로 토큰이 노출될 수 있다.

HttpOnly 쿠키 사용, HTTPS 강제, 짧은 만료 시간 설정

토큰 저장

클라이언트 측(예: 로컬 스토리지)에 저장 시 취약점이 있다.

안전한 저장 매체(보안 쿠키) 사용 고려

알고리즘 변경

'none' 알고리즘[2] 또는 취약한 알고리즘 사용을 주의해야 한다.

서버 측에서 허용하는 알고리즘을 엄격히 제한한다.

정보 노출

페이로드의 정보가 노출된다.

민감 정보 저장 금지, 필요 시 JWE를 사용한 암호화 적용

마지막으로, JWT는 본래 정보 교환을 위해 설계되었으며, 세션 관리에 사용될 때는 위의 보안 문제들을 충분히 인지하고 구조를 설계해야 한다. 특히 대규모 시스템에서의 로그아웃 처리나 토큰 블랙리스트 관리는 추가적인 오버헤드를 발생시킨다.

5. JWT의 주요 사용 사례

JWT는 JSON 형식의 정보를 안전하게 전송하기 위한 토큰으로, 여러 분야에서 널리 사용된다. 가장 대표적인 사용 사례는 웹 애플리케이션과 API에서의 사용자 인증이다. 사용자가 로그인하면 서버는 사용자의 신원 정보를 담은 JWT를 생성하여 클라이언트에 반환한다. 이후 클라이언트는 이 토큰을 HTTP 요청의 Authorization 헤더에 담아 서버에 보내고, 서버는 토큰의 서명을 검증하여 요청의 유효성을 확인한다. 이 방식은 세션을 서버에 저장할 필요가 없어 서버 확장성을 높이는 데 기여한다.

정보 교환 또한 JWT의 주요 용도 중 하나이다. JWT는 디지털 서명을 통해 발급자와 데이터의 무결성을 검증할 수 있어, 당사자 간에 정보를 안전하게 전송하는 데 적합하다. 예를 들어, OAuth 2.0 프로토콜에서 액세스 토큰이나 ID 토큰으로 JWT를 사용하여 리소스 접근 권한이나 사용자 기본 프로필 정보를 전달한다. 토큰 내부의 페이로드에는 필요한 클레임을 직접 포함시킬 수 있어, 데이터베이스 조회 없이도 정보를 확인할 수 있는 이점이 있다.

단일 사인온(SSO) 시스템에서 JWT는 핵심 구성 요소로 작동한다. 사용자가 하나의 인증 서버(IdP)에 로그인하면, 해당 서버는 JWT를 발급한다. 이 토큰을 사용자는 다른 여러 신뢰받는 애플리케이션이나 서비스에 접근할 때 제시할 수 있다. 각 애플리케이션은 토큰의 서명을 검증하여 중앙 인증 서버를 다시 거치지 않고도 사용자를 신원 확인하고 자원 접근을 허가한다. 이는 사용자 경험을 단순화하고 인증 관리를 중앙 집중화하는 데 효과적이다.

사용 사례

주요 목적

JWT의 역할

인증

사용자 신원 확인 및 API 접근 제어

서명된 토큰으로 상태를 유지하지 않는(Stateless) 인증 구현

정보 교환

당사자 간 안전한 데이터 전송

서명 또는 암호화를 통해 데이터 무결성과 기밀성 보장

단일 사인온(SSO)

한 번의 로그인으로 여러 서비스 이용

중앙 인증 서버가 발급한 토큰을 여러 서비스가 신뢰하고 검증

5.1. 인증

JWT는 인증과 권한 부여를 처리하는 데 널리 사용되는 방법이다. 서버는 사용자의 로그인 정보를 확인한 후, 해당 사용자의 신원과 권한을 담은 JWT를 생성하여 클라이언트에게 발급한다. 이후 클라이언트는 이 토큰을 보관하고, 보호된 리소스에 접근할 때마다 HTTP 요청의 Authorization 헤더에 토큰을 첨부하여 전송한다.

서버는 매번 요청을 받을 때마다 토큰의 서명을 검증하여 위변조 여부를 확인한다. 서명이 유효하면, 서버는 별도의 데이터베이스 조회 없이 토큰 내부(페이로드)에 포함된 정보(예: 사용자 ID, 역할, 만료 시간)를 신뢰하고 요청을 처리한다. 이는 상태 비저장 인증 메커니즘의 핵심이다.

JWT 기반 인증의 주요 흐름은 다음 표와 같다.

단계

주체

행위

설명

1. 로그인

클라이언트

자격 증명 전송

사용자 ID, 비밀번호 등을 서버에 제출한다.

2. 토큰 발급

서버

JWT 생성 및 반환

자격 증명을 검증하고, 서명된 JWT를 생성하여 응답한다.

3. 요청

클라이언트

토큰 첨부

API 요청 시 Authorization: Bearer <토큰> 헤더를 포함한다.

4. 검증 및 응답

서버

서명 검증 및 처리

서명을 검증하고, 페이로드 정보를 기반으로 요청을 이행한다.

이 방식은 특히 마이크로서비스 아키텍처나 RESTful API와 같은 분산 시스템에서 유용하다. 각 서비스가 독립적으로 토큰을 검증할 수 있어, 중앙 집중식 세션 저장소에 의존하지 않아도 된다. 그러나 토큰이 탈취당할 경우 발생할 수 있는 보안 문제를 방지하기 위해, HTTPS 사용과 짧은 토큰 만료 시간 설정, 민감한 정보를 페이로드에 저장하지 않는 것 등이 중요하다[3].

5.2. 정보 교환

JWT는 인증 외에도 당사자 간에 정보를 안전하게 교환하는 데 사용됩니다. 이는 암호화 서명을 통해 데이터의 무결성과 신뢰성을 보장하기 때문입니다. 페이로드에 필요한 정보를 포함시켜 별도의 데이터베이스 조회 없이도 정보를 전달하고 검증할 수 있습니다.

주요 정보 교환 시나리오는 다음과 같습니다.

사용 사례

설명

API 간 통신

마이크로서비스 아키텍처에서 서비스 간 호출 시 사용자 컨텍스트나 권한을 전파합니다.

이벤트 또는 메시지 전달

시스템 간에 전달되는 이벤트 메시지에 JWT를 첨부하여 발신자와 데이터의 신뢰성을 입증합니다.

일회성 작업 승인

비밀번호 재설정 링크나 이메일 확인 링크에 JWT를 포함하여 유효성과 만료 시간을 관리합니다.

이러한 방식은 데이터를 자체적으로 포함하는 자기 기술 토큰의 특성을 활용합니다. 서명된 JWT는 수신자가 발급자를 신뢰할 수 있고, 내용이 중간에 조작되지 않았음을 확인할 수 있게 합니다. 그러나 페이로드의 정보는 기본적으로 Base64로 인코딩될 뿐 암호화되지 않으므로, 민감한 정보를 포함할 경우 반드시 JWE를 사용하여 암호화해야 합니다[4].

5.3. 단일 사인온(SSO)

단일 사인온(SSO)은 사용자가 한 번의 로그인으로 여러 개의 관련된 애플리케이션 또는 서비스에 접근할 수 있도록 하는 인증 메커니즘이다. JWT는 이러한 SSO 시스템을 구현하는 데 매우 효과적인 도구로 사용된다. 중앙 집중식 인증 서버(예: IDP)가 사용자를 인증하고, 그 결과를 JWT 형태로 발급하면, 사용자는 이 토큰을 다른 서비스나 애플리케이션(SP)에 제시하여 추가 로그인 없이 접근 권한을 획득한다.

SSO에서 JWT의 핵심 역할은 신뢰할 수 있는 인증 정보의 전달자이다. 인증 서버는 토큰을 생성할 때 서명을 추가하여, 토큰의 내용이 위변조되지 않았음을 보장한다. 이후 사용자가 다른 서비스에 접근할 때마다, 해당 서비스는 토큰의 서명을 공유된 비밀 키 또는 공개 키로 검증함으로써 인증 서버를 직접 확인하지 않고도 사용자의 신원과 권한을 신뢰할 수 있다. 이는 마이크로서비스 아키텍처 환경에서 특히 유용하며, 각 서비스가 독립적으로 인증 결정을 내릴 수 있게 한다.

JWT 기반 SSO의 주요 구현 패턴은 다음과 같다.

패턴

설명

특징

리디렉션 기반 흐름

사용자가 SP에 접근하면 IDP로 리디렉션되어 로그인 후 JWT를 획득하여 돌아옴[5].

웹 브라우저 환경에 적합하며, 토큰이 URL 프래그먼트나 쿠키를 통해 전달된다.

API 게이트웨이 패턴

모든 요청이 게이트웨이를 통과하며, 게이트웨이가 JWT를 검증하고 검증된 사용자 정보를 백엔드 서비스에 전달한다.

백엔드 서비스들은 인증 로직에서 해방되며, 보안 정책을 중앙에서 관리할 수 있다.

이 방식은 사용자 경험을 향상시키고, 인증 관리를 중앙화하여 보안 정책을 일관되게 적용할 수 있다는 장점이 있다. 그러나 JWT 자체의 특성상, 발급된 토큰을 강제로 만료시키는 것이 어렵기 때문에, 짧은 유효 기간 설정과 리프레시 토큰의 활용, 또는 블랙리스트 관리와 같은 추가적인 보안 조치가 필요하다.

6. JWT 구현 및 라이브러리

JWT는 다양한 프로그래밍 언어와 환경에서 폭넓게 지원된다. 주로 웹 서버와 API 개발에 사용되는 언어들을 중심으로 공식 및 커뮤니티 라이브러리가 존재한다.

구현 언어

주요 라이브러리 예시

JavaScript / Node.js

jsonwebtoken, jose, jwt-simple

Python

PyJWT, python-jose

Java

jjwt (Java JWT), Nimbus JOSE+JWT, auth0-java-jwt

C# / .NET

System.IdentityModel.Tokens.Jwt (Microsoft 공식), JWT.Net

Go

golang-jwt/jwt, jose

PHP

firebase/php-jwt, lcobucci/jwt

Ruby

jwt, ruby-jwt

이러한 라이브러리들은 일반적으로 JWT의 생성, 서명, 검증, 디코딩 기능을 제공한다. 라이브러리를 선택할 때는 공식 문서의 명확성, 최근 업데이트 빈도, 보안 취약점 패치 이력, 그리고 커뮤니티의 활성화 정도를 고려하는 것이 중요하다. 특히 서명 알고리즘(HMAC, RSA, ECDSA) 지원 범위와 토큰 만료 처리, 클레임 검증과 같은 보안 관련 기능이 충실히 구현되어 있는지 확인해야 한다.

일부 웹 프레임워크는 JWT 처리를 위한 내장 모듈이나 공식 확장 패키지를 제공하기도 한다. 예를 들어, Node.js의 Express 프레임워크에서는 jsonwebtoken 라이브러리가, Python의 FastAPI에서는 python-jose가 널리 활용된다. 이러한 통합은 개발자가 인증 흐름을 더 쉽게 구성할 수 있게 돕는다.

6.1. 공통 구현 언어

JWT는 언어에 구애받지 않는 개방형 표준이므로, 대부분의 현대 프로그래밍 언어에서 구현이 가능하다. 특히 웹 서버 및 API 개발에 널리 사용되는 언어들을 중심으로 공식 및 서드파티 라이브러리가 잘 구축되어 있다.

주요 구현 언어와 그 특징은 다음과 같다.

언어

주요 특징 및 라이브러리

JavaScript / Node.js

서버 사이드(Node.js)에서는 jsonwebtoken 라이브러리가 사실상 표준이다. 클라이언트 사이드(브라우저)에서는 jwt-decode와 같은 라이브러리를 사용해 토큰 디코딩이 일반적이다.

Python

PyJWT 라이브러리가 가장 널리 사용된다. Django 프레임워크에는 djangorestframework-simplejwt와 같은 전용 패키지도 존재한다.

Java

jjwt (Java JWT) 라이브러리가 인기가 높다. Spring Security 프레임워크와의 통합도 잘 지원된다.

C# / .NET

System.IdentityModel.Tokens.Jwt 네임스페이스의 공식 라이브러리를 주로 사용한다.

Go

golang-jwt/jwt 패키지가 표준 라이브러리처럼 널리 채택되었다.

PHP

firebase/php-jwt 라이브러리가 경량화되고 사용하기 쉬워 많이 활용된다.

Ruby

jwt 젬이 공식적으로 유지보수되며 대표적인 구현체 역할을 한다.

이러한 언어별 라이브러리들은 일반적으로 JWT의 생성, 서명, 검증 기능을 제공한다. 선택한 언어의 생태계와 프레임워크에 맞는 검증된 라이브러리를 사용하는 것이 보안과 유지보수 측면에서 중요하다.

6.2. 인기 라이브러리

다양한 프로그래밍 언어와 프레임워크를 위한 JWT 라이브러리가 존재하며, 이들은 토큰 생성, 서명, 검증 기능을 표준화된 방식으로 제공한다. 대부분의 라이브러리는 RFC 7519 표준을 준수하며, HMAC, RSA, ECDSA와 같은 서명 알고리즘을 지원한다.

주요 언어별 인기 라이브러리는 다음과 같다.

언어/플랫폼

대표 라이브러리

주요 특징

JavaScript/Node.js

jsonwebtoken

Node.js 생태계에서 사실상의 표준 라이브러리로 널리 사용된다.

Python

PyJWT

파이썬에서 가장 일반적으로 사용되는 JWT 구현체이다.

Java

jjwt (Java JWT)

사용이 간편하고 널리 채택된 자바 라이브러리이다.

.NET (C#)

System.IdentityModel.Tokens.Jwt

Microsoft의 공식 지원 라이브러리로, .NET 애플리케이션에 통합하기 용이하다.

Go

golang-jwt/jwt

Go 커뮤니티에서 활발히 관리되고 있는 표준적인 라이브러리이다.

PHP

firebase/php-jwt

Firebase에서 개발하고 유지 관리하는 경량 라이브러리이다.

Ruby

jwt

RubyGem으로 제공되는 주요 JWT 구현체이다.

이들 라이브러리는 종종 프레임워크별 인증 솔루션에 통합되어 사용된다. 예를 들어, Spring Security는 Java 환경에서, Passport.js는 Node.js 환경에서 JWT를 활용한 인증 전략을 제공한다. 라이브러리 선택 시 프로젝트의 언어, 프레임워크, 성능 요구사항, 보안 알고리즘 지원 범위, 커뮤니티 활성도 및 유지보수 상태를 고려해야 한다.

7. JWT와 다른 토큰 방식 비교

JWT는 세션 기반 인증과 OAuth와 같은 다른 인증 및 권한 부여 방식과 비교하여 명확한 차이점을 가진다. 각 방식은 특정 사용 사례와 요구 사항에 적합한 특징을 지닌다.

JWT vs 세션

JWT와 전통적인 세션 기반 인증은 상태 관리 방식에서 근본적인 차이가 있다. 세션 방식은 서버 측에 사용자의 인증 상태를 저장한다. 클라이언트는 로그인 후 서버로부터 세션 ID를 담은 쿠키를 받고, 이후 요청마다 이 쿠키를 보낸다. 서버는 이 ID를 키로 사용해 서버 측 저장소(메모리, 데이터베이스 등)에서 해당 세션 정보를 조회하여 사용자를 인증한다. 이는 서버에 상태를 유지하는 '상태성(Stateful)' 접근법이다.

반면 JWT는 무상태성(Stateless)을 핵심 원리로 한다. 인증에 필요한 모든 정보(클레임)가 토큰 자체에 포함되어 있으며, 서명을 통해 무결성이 보장된다. 서버는 별도의 저장소에서 상태를 조회할 필요 없이 토큰의 서명만 검증하면 사용자를 인증할 수 있다. 이는 서버 확장성과 분산 시스템에 유리하지만, 토큰 자체가 크고 폐기 관리가 복잡하다는 단점이 있다[6].

JWT vs OAuth

JWT와 OAuth는 서로 다른 계층의 개념이다. JWT는 정보를 안전하게 표현하는 토큰의 '형식(Format)'에 해당한다. 반면 OAuth는 제3자 애플리케이션에 리소스 접근 권한을 위임하기 위한 '권한 부여 프레임워크(Authorization Framework)'이다. OAuth 2.0 표준에서는 클라이언트가 리소스 서버에 접근할 때 사용하는 액세스 토큰(Access Token)의 구체적인 형식을 정의하지 않는다.

이 두 개념은 함께 사용되는 경우가 많다. OAuth 2.0 흐름을 통해 발급받은 액세스 토큰의 형식으로 JWT가 채택될 수 있다. 이를 JWT Bearer Token 프로파일이라고 한다. 이 경우, JWT의 페이로드에 권한 범위(스코프(Scope))나 클라이언트 정보 등을 담을 수 있어, 리소스 서버가 토큰을 별도로 조회하지 않고도 내부 정보를 신뢰하고 활용할 수 있다. 따라서 OAuth는 권한 부여의 흐름을, JWT는 그 흐름에서 교환되는 자격 증명의 포맷을 담당한다고 볼 수 있다.

아래 표는 주요 차이점을 요약한 것이다.

비교 항목

JWT (JSON Web Token)

세션 (Session)

OAuth 2.0

주요 목적

정보를 안전하게 전송/인증하는 토큰 형식

서버 측에서 사용자 상태를 유지하는 메커니즘

제3자에게 리소스 접근 권한을 위임하는 프레임워크

상태 관리

무상태성 (Stateless)

상태성 (Stateful)

주로 무상태성 (액세스 토큰에 따라)

저장 위치

클라이언트 측 (주로 로컬 스토리지 또는 쿠키)

서버 측 (세션 저장소)

클라이언트가 액세스 토큰 보관, 인증 서버가 발급 정보 관리

확장성

서버 확장에 유리 (상태 공유 불필요)

서버 확장 시 세션 저장소 공유 필요

프레임워크 자체가 분산 환경을 고려해 설계됨

토큰 형식

JWT가 곧 토큰 형식

세션 ID (일반적으로 불투명한 문자열)

액세스 토큰의 형식을 정의하지 않음 (JWT 사용 가능)

7.1. JWT vs 세션

JWT와 세션 기반 인증은 모두 웹 애플리케이션에서 사용자의 상태를 관리하는 주요 방식이다. 그러나 그 접근법과 특성에서 근본적인 차이를 보인다.

JWT는 클라이언트 측에 상태 정보를 저장하는 무상태성 방식을 채택한다. 서버는 토큰을 생성하고 서명한 후 클라이언트에게 전달하면, 이후 클라이언트는 이 토큰을 요청 시마다 함께 보낸다. 서버는 토큰의 서명만 검증하여 그 유효성을 판단하며, 별도의 세션 저장소를 유지할 필요가 없다. 이는 서버의 확장성을 높이고, 마이크로서비스 아키텍처와 같은 분산 환경에 적합하다. 반면, 전통적인 세션 방식은 상태성을 유지한다. 서버는 사용자 로그인 시 고유한 세션 ID를 생성하여 안전한 저장소(예: 메모리, 데이터베이스, Redis)에 저장하고, 이 ID를 쿠키 등을 통해 클라이언트에게 전달한다. 클라이언트의 이후 요청에는 이 세션 ID가 포함되며, 서버는 이를 받아 저장소에서 해당 사용자의 상태 정보를 조회한다.

두 방식의 주요 차이점은 아래 표와 같이 정리할 수 있다.

특성

JWT (JSON Web Token)

세션 (Session)

상태 관리

무상태 (Stateless)

상태 유지 (Stateful)

정보 저장 위치

토큰 자체 (클라이언트 측)

서버 측 저장소

확장성

서버 확장이 용이함

저장소 공유 또는 복제가 필요함

주요 보안 고려사항

토큰 탈취, 서명 키 관리

세션 ID 탈취(세션 하이재킹), 저장소 보안

토큰/세션 무효화

만료 시간에 의존, 즉시 무효화 어려움

서버 측에서 즉시 삭제 가능

보안 측면에서 JWT는 토큰이 탈취당하면 만료 시간까지 악용될 수 있는 위험이 있다. 이를 완화하기 위해 짧은 만료 시간을 설정하고 리프레시 토큰을 활용한다. 세션 방식은 서버 측에서 즉시 세션을 무효화할 수 있어 통제력이 높지만, 세션 저장소에 대한 부하와 세션 고정 공격 등의 위협에 노출될 수 있다. 선택은 애플리케이션의 아키텍처, 확장성 요구사항, 보안 정책에 따라 달라진다.

7.2. JWT vs OAuth

JWT와 OAuth는 모두 현대 웹 인증 및 권한 부여에서 중요한 역할을 하지만, 그 목적과 범위, 작동 방식에서 근본적인 차이를 보인다. JWT는 주로 정보를 안전하게 표현하는 토큰 형식(포맷)이며, OAuth는 권한 위임을 위한 프레임워크(프로토콜)이다. 이는 핵심적인 구분점으로, OAuth 프레임워크 내에서 접근 토큰을 전달하는 수단으로 JWT가 사용될 수 있다[7].

다음 표는 두 기술의 주요 차이점을 요약한다.

구분

JWT (JSON Web Token)

OAuth (주로 OAuth 2.0)

성격

토큰 포맷(표준)

권한 부여 프레임워크(프로토콜)

주요 목적

당사자 간 정보를 JSON 객체로 안전하게 전송

제3자 애플리케이션에 사용자 자원에 대한 제한된 접근 권한을 위임

구성 요소

헤더, 페이로드, 서명의 세 부분으로 구성된 토큰 자체

리소스 소유자, 클라이언트, 리소스 서버, 인증 서버 등의 역할과 인증 코드, 액세스 토큰, 리프레시 토큰 등의 흐름

정보 포함

클레임(주체, 만료 시간, 사용자 데이터 등)을 자체적으로 포함

일반적으로 토큰 자체는 불투명한 문자열이며, 별도로 정보를 조회해야 함(단, JWT 포맷의 액세스 토큰 사용 가능)

의존성

독립적인 표준으로 사용 가능

토큰 발급 및 흐름 관리에 중점을 두며, 발급된 토큰의 형식을 규정하지 않음

실제 구현에서 둘은 상호 보완적으로 사용된다. OAuth 2.0은 액세스 토큰을 발급하는 메커니즘을 정의하는 반면, 그 액세스 토큰의 형식으로 JWT를 채택할 수 있다. 이렇게 하면 토큰이 자체 포함적(self-contained)이 되어 리소스 서버가 인증 서버에 별도로 문의하지 않고도 토큰의 유효성과 클레임을 검증할 수 있다. 따라서 "JWT 대 OAuth"라는 비교는 정확히는 "토큰 형식 대 권한 부여 프로토콜"의 비교에 가깝다. 시스템 설계 시 JWT는 정보 교환의 수단으로, OAuth는 제3자 접근 권한을 관리하는 전체적인 구조로 이해하는 것이 바람직하다.

8. 관련 문서

  • JWT.io - Introduction to JSON Web Tokens

  • IETF RFC 7519 - JSON Web Token (JWT)

  • MDN Web Docs - JSON Web Token (JWT) 소개

  • Auth0 - JWT Handbook

  • Microsoft Learn - JSON Web Tokens (JWT) in ASP.NET Core

  • Okta Developer - What is a JWT?

  • 위키백과 - JSON 웹 토큰

리비전 정보

버전r1
수정일2026.02.14 23:11
편집자unisquads
편집 요약AI 자동 생성