JSON 웹 토큰
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
JSON 웹 토큰(JWT)은 헤더, 페이로드, 서명 세 부분으로 구성되며, 주로 사용자 인증 및 권한 부여에 사용되는 개방형 표준(RFC 7519)이다. 헤더는 토큰 유형과 서명 알고리즘을, 페이로드는 클레임(claim) 정보를 담고, 서명은 토큰의 무결성을 보장한다. JWT는 Base64url 인코딩을 사용하여 각 부분을 인코딩하고, 점(.)으로 연결하여 생성된다. JWT는 여러 프로그래밍 언어에서 구현되어 사용 가능하며, 만료 시간 설정, `alg` 필드 검증, 알고리즘 및 키 크기 선택 등에 주의하여 취약점을 예방해야 한다.
더 읽어볼만한 페이지
JSON 웹 토큰 | |
---|---|
기본 정보 | |
![]() | |
유형 | 인터넷 표준 |
약칭 | JWT |
개발 | IETF |
최초 게시일 | 2010년 12월 28일 |
버전 날짜 | 2015년 5월 |
위원회 | IEGS |
편집자 | Michael B. Jones Microsoft John Bradley Ping Identity Nat Sakimura NRI |
관련 표준 | JSON JSON 웹 암호화 (JWE) JSON 웹 서명 (JWS) |
도메인 | 데이터 교환 |
웹사이트 | JSON 웹 토큰 (JWT) 공식 웹사이트 |
기술 정보 | |
기반 표준 | JSON JSON Web Encryption (JWE) JSON Web Signature (JWS) |
2. 구조
JSON 웹 토큰(JWT)은 헤더(Header), 페이로드(Payload), 서명(Signature)의 세 부분으로 구성되며, 각 부분은 점(.)으로 구분된다. JWT는 Base64url 인코딩을 사용하여 각 부분을 인코딩하고, 점(.)으로 연결하여 생성한다.
```javascript
const token = base64urlEncoding(header) + '.' + base64urlEncoding(payload) + '.' + base64urlEncoding(signature)
```
JWT는 콤팩트하게 설계되었으며, URL에 안전하고, 특히 웹 브라우저에서 싱글 사인온(SSO)을 수행하는 경우 사용하기 편리하다. 토큰에는 일반적으로 인증 프로바이더나 서비스 제공자가 인증한 사용자 식별 정보뿐만 아니라, 각 서비스에 필요한 정보도 저장된다. JWT는 JSON 기반의 오픈 표준인 JSON Web Signature영어(JWS) 및 JSON Web Encryption영어(JWE)에 기반하고 있다.
2. 1. 헤더 (Header)
헤더는 서명 생성에 사용되는 알고리즘을 식별한다. 일반적으로 사용되는 암호화 알고리즘은 HMAC와 SHA-256 (HS256), RSA 서명과 SHA-256 (RS256)이다. JWA (JSON 웹 알고리즘) RFC 7518은 인증과 암호화 모두를 위해 더 많은 알고리즘을 소개한다.[7]예시는 다음과 같다.
2. 2. 페이로드 (Payload)
페이로드는 토큰에 담을 정보, 즉 클레임(Claim)을 포함하는 JSON 객체이다. JWT 사양은 토큰에 일반적으로 포함되는 7개의 등록된 클레임 이름(표준 필드)을 정의한다.[57] 토큰의 목적에 따라 사용자 지정 클레임 또한 일반적으로 포함된다.다음은 표준 발행 시간 클레임(iat영어)과 사용자 지정 클레임(loggedInAs영어)을 보여주는 예시이다.
```json
{
"loggedInAs" : "admin",
"iat" : 1422779638
}
```
JWT (JSON 웹 토큰)에서는 토큰 내에 임의의 정보(클레임)를 보관할 수 있다. 예를 들어, 서버는 클라이언트에 대해 "관리자로 로그인됨"이라는 정보를 포함한 토큰을 생성할 수 있으며, 클라이언트는 해당 토큰을 자신이 관리자로서 로그인되었음을 증명하는 데 사용할 수 있다.
2. 3. 서명 (Signature)
토큰을 안전하게 확인한다. 서명은 Base64url 인코딩을 이용하여 헤더와 페이로드를 인코딩하고 이 둘을 점(.) 구분자로 함께 연결시킴으로써 계산된다.[63] 해당 문자열은 그 뒤 헤더에 규정된 암호화 알고리즘(이번 경우에는 HMAC-SHA256)에 유입된다. Base64url 인코딩은 base64와 비슷하지만 각기 다른 영숫자를 사용하며 패딩(padding)은 제외한다.[63]```javascript
HMAC-SHA256(
secret,
base64urlEncoding(header) + '.' +
base64urlEncoding(payload)
)
2. 4. 전체 구조 예시
위의 데이터와 "secretkey" 시크릿은 다음의 토큰을 생성한다:[64]이 결과 토큰은 HTML과 HTTP 환경에서 쉽게 파싱될 수 있다.
헤더 | style="width: 22em;" | | 서명 생성을 위해 사용될 알고리즘을 식별한다. |
---|---|---|
페이로드 | 일련의 클레임을 포함한다. JWT 사양은 토큰에 일반적으로 포함되는 표준 필드인 7개의 등록 클레임 이름(Registered Claim Names)을 정의한다.[57] 토큰의 목적에 따라 사용자 지정 클레임 또한 일반적으로 포함된다. | |
서명 | 토큰을 안전하게 확인한다. 서명은 Base64url 인코딩을 이용하여 헤더와 페이로드를 인코딩하고 이 둘을 점(.) 구분자로 함께 연결시킴으로써 계산된다. 해당 문자열은 그 뒤 헤더에 규정된 암호화 알고리즘(이번 경우에는 HMAC-SHA256)에 유입된다. Base64url 인코딩은 base64와 비슷하지만 각기 다른 영숫자를 사용하며 패딩(padding)은 제외한다. |
JWT 표준(RFC 7519)은 페이로드에 포함될 수 있는 표준 클레임들을 정의한다. JWT는 토큰 내에 임의의 정보(클레임)를 보관할 수 있으며, 예를 들어 서버는 클라이언트에 대해 "관리자로 로그인됨"이라는 정보를 포함한 토큰을 생성할 수 있다. 클라이언트는 해당 토큰을 자신이 관리자로서 로그인되었음을 증명하는 데 사용할 수 있다. 토큰은 당사자 중 한쪽(일반적으로 서버) 또는 양쪽(다른 한쪽은 공개 키를 제공)의 비밀 키에 의해 서명되며, 발행된 토큰이 정품인지 확인할 수 있다.
3. 표준 필드
JWT 토큰은 콤팩트하게 설계되었으며[44], URL에 안전하며[52], 특히 웹 브라우저에서 싱글 사인온(SSO)을 수행하는 경우 사용하기 편리하다. 토큰에는 일반적으로 서비스 제공자가 인증한 사용자 식별 정보가 저장될 뿐만 아니라, 각 서비스에 필요한 정보도 저장된다.[45][46]
JWT는 다른 JSON 기반의 오픈 표준인 JWS(, RFC 7515) 및 JWE(, RFC 7516)에 기반하고 있다.[47][48][49]
표준 클레임 필드 외에 일반적으로 사용되는 헤더 필드가 있다.
3. 1. 등록된 클레임 (Registered Claims)
Registered Claims영어
JWT(JSON 웹 토큰)의 표준으로 등록된 클레임은 다음과 같다.
코드 | 명칭 | 설명 |
---|---|---|
iss | 발급자(Issuer영어) | 토큰 발행자를 식별한다.[9] |
sub | 주체(Subject영어) | 토큰의 주체를 식별한다.[9] |
aud | 대상자(Audience영어) | 토큰이 대상으로 하는 수신자를 식별한다. 토큰을 처리하는 측에서는 이 값으로 자신을 식별해야 한다. aud 클레임이 존재하는데, 값으로 자신을 식별하지 않으면 JWT는 거부되어야 한다.[9] |
exp | 만료 시간(Expiration Time영어) | JWT가 처리에 대해 수락해서는 안 되는 만료 시간을 식별한다. 값은 1970-01-01 00:00:00Z 이후의 초를 나타내는 정수 또는 십진수인 NumericDate여야 한다.[9] |
nbf | 유효 전(Not Before영어) | JWT가 처리를 위해 수락되기 시작하는 시간을 식별한다. 값은 NumericDate여야 한다.[9] |
iat | 발급 시간(Issued At영어) | JWT가 발급된 시간을 식별한다. 값은 NumericDate여야 한다.[9] |
jti | JWT ID | 다른 발급자들 사이에서도 토큰의 대소문자를 구분하는 고유 식별자이다.[9] |
현재 등록된 클레임 이름 목록은 IANA JSON 웹 토큰 클레임 레지스트리에서 얻을 수 있다.[10]
3. 2. 일반적인 헤더 필드
JWT영어의 헤더에서 일반적으로 사용되는 필드는 다음과 같다.
4. 이용
JWT는 주로 사용자 인증 및 권한 부여에 사용된다. 사용자가 로그인하면 서버는 JWT를 생성하여 클라이언트에 반환한다. 클라이언트는 이후 요청 시 JWT를 `Authorization` HTTP 헤더에 담아 전송한다(Bearer 스키마 사용). 서버는 JWT를 검증하여 사용자를 인증하고, 필요한 정보를 추출하여 요청을 처리한다.
JWT는 서버에 인증 상태를 유지하지 않는 무상태 인증 방식이다. JWT에는 인증에 필요한 모든 정보가 포함되어 있어 데이터베이스 쿼리를 줄일 수 있다.[44] JWT는 URL에 사용하기 안전하며,[52] 웹 브라우저에서 싱글 사인온(SSO)을 수행하는 경우 사용하기 편리하다.[45][46]
JWT는 JSON Web Signature|JSON 웹 서명영어(JWS) 및 JSON Web Encryption|JSON 웹 암호화영어(JWE)에 기반하고 있다.[47][48][49]
사용자가 서버에 로그인을 시도할 때, 기존의 세션 기반 인증 방식은 쿠키를 통해 세션 ID를 반환하지만, JWT에서는 토큰이 반환되어 로컬에 저장하여 사용한다(주로 Web storage|웹 스토리지영어가 사용된다. 세션 ID처럼 쿠키를 사용하는 경우도 있다).
인증 과정에서 사용자가 성공적으로 로그인하면 종종 JWT가 반환된다. 이 토큰은 HTTP-only 쿠키와 같은 보안 메커니즘을 사용하여 클라이언트에 전송해야 한다. JWT를 로컬 또는 세션 스토리지와 같은 브라우저 스토리지 메커니즘에 로컬로 저장하는 것은 권장되지 않는다. 이는 클라이언트 측에서 실행되는 JavaScript(브라우저 확장 포함)가 이러한 스토리지 메커니즘에 접근하여 JWT를 노출하고 보안을 손상시킬 수 있기 때문이다.
서버는 클라이언트에 대해 "관리자로 로그인됨"이라는 정보를 포함한 토큰을 생성할 수 있다. 클라이언트는 해당 토큰을 자신이 관리자로서 로그인되었음을 증명하는 데 사용할 수 있다. 토큰은 당사자 중 한쪽(일반적으로 서버) 또는 양쪽(공개 키를 제공)의 비밀 키에 의해 서명되며, 발행된 토큰이 정품인지 확인할 수 있다.
5. 구현체
JWT는 다양한 프로그래밍 언어와 프레임워크에서 구현되어 있다.[65]
프로그래밍 언어 | 구현체 여부 |
---|---|
.NET (C# VB.Net 등) | [65] |
C | [66] |
클로저 | [67] |
커먼 리스프 | [68] |
다트 | [69] |
Elixir | [70] |
Erlang | [71] |
Go | [71] |
하스켈 | [72] |
자바 | [73] |
자바스크립트 | [74] |
루아 | [75] |
Node.js | [76] |
OCaml | [77] |
펄 | [78] |
PHP | [79] |
PL/SQL | [80] |
파워셸 | [81] |
파이썬 | [82] |
래킷 | [83] |
라쿠 | [84] |
루비 | [85] |
러스트 | [86][87] |
스칼라 | [88] |
스위프트 | [89] |
6. 취약성
JSON 웹 토큰(JWT)은 세션 상태를 포함할 수 있지만, JWT 만료 전에 세션을 무효화해야 하는 경우 서비스는 토큰만으로 유효성을 신뢰할 수 없다. 토큰에 저장된 세션이 해지되지 않았는지 확인하려면 데이터 저장소에 대해 확인해야 하며, 이로 인해 JWT의 주요 장점인 무상태성이 훼손된다.[90][36]
보안 컨설턴트 팀 맥클린(Tim McLean)은 일부 JWT 라이브러리에서 `alg` 필드를 사용하여 토큰을 잘못 검증하는 취약점을 보고했다. 가장 흔하게 `alg=none` 토큰을 허용하는 방식이었다. 이러한 취약점은 패치되었지만, 맥클린은 유사한 구현 혼란을 방지하기 위해 `alg` 필드를 완전히 사용 중단할 것을 제안했다.[91][37] 그럼에도 불구하고 새로운 `alg=none` 취약점이 여전히 발견되고 있으며, 2018-2021년 기간 동안 이로 인해 네 개의 CVE가 등록되었다.[38]
적절한 설계를 통해 개발자는 다음과 같은 예방 조치를 취하여 알고리즘 취약점을 해결할 수 있다.[92][93][39][40]
- JWT 헤더만으로 검증하지 말 것
- 알고리즘을 숙지할 것 (alg영어 필드에만 의존하지 말 것)
- 적절한 키 크기를 사용할 것
소프트웨어 보안 설계자 커트 로다머(Kurt Rodarmer)는 암호화 서명 키와 관련한 JWT의 추가적인 설계적 취약성, 그리고 라이브러리의 JSON 파서가 공격에 노출되는 중대한 취약성을 지적한다.[94]
2017년에는 여러 JWT 라이브러리에서 무효한 타원 곡선 공격에 취약한 것으로 밝혀졌다.[41]
JWT는 상태 비저장이므로 JWT 자체로는 토큰을 무효화할 수 없다. 기존 세션처럼 서버에 상태를 유지하면 가능하지만, 그 경우 상태 비저장의 이점은 사라진다.[54]
참조
[1]
간행물
JSON Web Token (JWT)
IETF
2015-05
[2]
서적
Mastering Identity and Access Management with Microsoft Azure
https://books.google[...]
Packt Publishing
2018-07-20
[3]
웹사이트
The Anatomy of a JSON Web Token
https://scotch.io/tu[...]
2015-05-08
[4]
웹사이트
Atlassian Connect Documentation
https://developer.at[...]
2015-05-08
[5]
학술지
draft-ietf-jose-json-web-signature-41 - JSON Web Signature (JWS)
https://tools.ietf.o[...]
2015-05-08
[6]
학술지
draft-ietf-jose-json-web-encryption-40 - JSON Web Encryption (JWE)
https://tools.ietf.o[...]
2015-05-08
[7]
학술지
draft-ietf-jose-json-web-algorithms-40 - JSON Web Algorithms (JWA)
https://tools.ietf.o[...]
2015-05-08
[8]
웹사이트
JWT.IO - JSON Web Tokens Introduction
https://jwt.io/intro[...]
2018-07-20
[9]
간행물
JSON Web Token (JWT)
IETF
2015-05
[10]
웹사이트
JSON Web Token (JWT)
https://www.iana.org[...]
2024-12-05
[11]
Github
jwt-dotnet
https://github.com/j[...]
[12]
Github
libjwt
https://github.com/b[...]
[13]
웹사이트
liquidz/clj-jwt
https://github.com/l[...]
2018-05-07
[14]
Github
cljwt
https://github.com/g[...]
[15]
Github
JustJWT
https://github.com/d[...]
[16]
웹사이트
bryanjos/joken
https://github.com/b[...]
2018-05-07
[17]
웹사이트
golang-jwt/jwt
https://github.com/g[...]
2018-01-08
[18]
웹사이트
jose: JSON Object Signing and Encryption (JOSE) and JSON Web Token (JWT) library
https://hackage.hask[...]
2022-12-25
[19]
Github
auth0/java-jwt
https://github.com/a[...]
[20]
웹사이트
kjur/jsrsasign
https://github.com/k[...]
2018-05-07
[21]
웹사이트
SkyLothar/lua-resty-jwt
https://github.com/S[...]
2018-05-07
[22]
웹사이트
jsonwebtoken
https://www.npmjs.co[...]
2018-05-07
[23]
Github
ocaml-jwt
https://github.com/b[...]
[24]
Cpan
Crypt::JWT
https://metacpan.org[...]
[25]
Github
lcobucci/jwt
https://github.com/l[...]
[26]
Citation
GitHub - morten-egan/jwt_ninja: PLSQL Implementation of JSON Web Tokens.
https://github.com/m[...]
2019-03-14
[27]
웹사이트
SP3269/posh-jwt
https://github.com/S[...]
2018-08-01
[28]
웹사이트
jpadilla/pyjwt
https://github.com/j[...]
2017-03-21
[29]
Pkgs
net-jwt
https://pkgs.racket-[...]
[30]
Github
JSON-WebToken
https://github.com/j[...]
[31]
Github
ruby-jwt
https://github.com/j[...]
[32]
Github
jsonwebtoken
https://github.com/K[...]
[33]
Github
rust-jwt
https://github.com/m[...]
[34]
Github
jwt-scala
https://github.com/p[...]
[35]
Github
JSONWebToken.swift
https://github.com/k[...]
[36]
웹사이트
Stop using JWT for sessions
http://cryto.net/~jo[...]
2018-08-01
[37]
웹사이트
Critical vulnerabilities in JSON Web Token libraries
https://www.chosenpl[...]
Auth0
2015-03-31
[38]
웹사이트
CVE - Search Results
https://cve.mitre.or[...]
[39]
웹사이트
Common JWT security vulnerabilities and how to avoid them
https://connect2id.c[...]
2018-05-14
[40]
웹사이트
JWT: Signature vs MAC attacks
https://snikt.net/bl[...]
2019-05-27
[41]
웹사이트
Critical Vulnerability in JSON Web Encryption
https://auth0.com/bl[...]
2023-10-14
[42]
웹사이트
No Way, JOSE! Javascript Object Signing and Encryption is a Bad Standard That Everyone Should Avoid - Paragon Initiative Enterprises Blog
https://paragonie.co[...]
2023-10-13
[43]
웹사이트
Pitfalls of JWT Authorization
https://authzed.com/[...]
2023-11-16
[44]
서적
Mastering Identity and Access Management with Microsoft Azure
https://books.google[...]
2018-07-20
[45]
웹사이트
The Anatomy of a JSON Web Token
https://scotch.io/tu[...]
2015-05-08
[46]
웹사이트
Atlassian Connect Documentation
https://developer.at[...]
2015-05-08
[47]
웹사이트
draft-ietf-oauth-json-web-token-32 - JSON Web Token (JWT)
https://tools.ietf.o[...]
2015-05-08
[48]
웹사이트
draft-ietf-jose-json-web-signature-41 - JSON Web Signature (JWS)
https://tools.ietf.o[...]
2015-05-08
[49]
웹사이트
draft-ietf-jose-json-web-encryption-40 - JSON Web Encryption (JWE)
https://tools.ietf.o[...]
2015-05-08
[50]
웹사이트
draft-ietf-jose-json-web-algorithms-40 - JSON Web Algorithms (JWA)
https://tools.ietf.o[...]
2015-05-08
[51]
웹사이트
JSON Web Token (JWT)
https://datatracker.[...]
2016-11-14
[52]
웹사이트
JWT.IO - JSON Web Tokens Introduction
https://jwt.io/intro[...]
2018-07-20
[53]
웹사이트
JSON Web Token (JWT)
https://datatracker.[...]
2017-12-20
[54]
웹사이트
Stop using JWT for sessions
http://cryto.net/~jo[...]
2018-08-01
[55]
웹사이트
Critical vulnerabilities in JSON Web Token libraries
https://www.chosenpl[...]
Auth0
2015-03-31
[56]
웹사이트
Common JWT security vulnerabilities and how to avoid them
https://connect2id.c[...]
2018-05-14
[57]
간행물
JSON Web Token (JWT)
IETF
2015-05
[58]
서적
Mastering Identity and Access Management with Microsoft Azure
https://books.google[...]
2018-07-20
[59]
웹인용
The Anatomy of a JSON Web Token
https://scotch.io/tu[...]
2015-05-08
[60]
웹인용
Atlassian Connect Documentation
https://developer.at[...]
2015-05-08
[61]
웹인용
draft-ietf-jose-json-web-signature-41 - JSON Web Signature (JWS)
https://tools.ietf.o[...]
2015-05-08
[62]
웹인용
draft-ietf-jose-json-web-encryption-40 - JSON Web Encryption (JWE)
https://tools.ietf.o[...]
2015-05-08
[63]
웹인용
draft-ietf-jose-json-web-algorithms-40 - JSON Web Algorithms (JWA)
https://tools.ietf.o[...]
2015-05-08
[64]
웹인용
JWT.IO - JSON Web Tokens Introduction
https://jwt.io/intro[...]
2018-07-20
[65]
깃허브
jwt-dotnet
https://github.com/j[...]
[66]
깃허브
libjwt
https://github.com/b[...]
[67]
웹인용
liquidz/clj-jwt
https://github.com/l[...]
2018-05-07
[68]
깃허브
cljwt
https://github.com/g[...]
[69]
깃허브
JustJWT
https://github.com/d[...]
[70]
웹인용
bryanjos/joken
https://github.com/b[...]
2018-05-07
[71]
웹인용
dgrijalva/jwt-go
https://github.com/d[...]
2018-01-08
[72]
웹인용
jwt: JSON Web Token (JWT) decoding and encoding
https://hackage.hask[...]
2018-05-07
[73]
깃허브
auth0/java-jwt
https://github.com/a[...]
[74]
웹인용
kjur/jsrsasign
https://github.com/k[...]
2018-05-07
[75]
웹인용
SkyLothar/lua-resty-jwt
https://github.com/S[...]
2018-05-07
[76]
웹인용
jsonwebtoken
https://www.npmjs.co[...]
2018-05-07
[77]
깃허브
ocaml-jwt
https://github.com/b[...]
[78]
CPAN
Crypt::JWT
https://metacpan.org[...]
[79]
깃허브
lcobucci/jwt
https://github.com/l[...]
[80]
인용
GitHub - morten-egan/jwt_ninja: PLSQL Implementation of JSON Web Tokens.
https://github.com/m[...]
2019-02-07
[81]
웹인용
SP3269/posh-jwt
https://github.com/S[...]
2018-08-01
[82]
웹인용
jpadilla/pyjwt
https://github.com/j[...]
2017-03-21
[83]
pkgs.racket-lang.org
net-jwt
https://pkgs.racket-[...]
[84]
깃허브
JSON-WebToken
https://github.com/j[...]
[85]
깃허브
ruby-jwt
https://github.com/j[...]
[86]
깃허브
frank_jwt
https://github.com/G[...]
[87]
깃허브
https://github.com/m[...]
[88]
깃허브
jwt-scala
https://github.com/p[...]
[89]
깃허브
JSONWebToken.swift
https://github.com/k[...]
[90]
웹인용
Stop using JWT for sessions
http://cryto.net/~jo[...]
2018-08-01
[91]
웹인용
Critical vulnerabilities in JSON Web Token libraries
https://www.chosenpl[...]
Auth0
2015-03-31
[92]
웹인용
Common JWT security vulnerabilities and how to avoid them
https://connect2id.c[...]
2018-05-14
[93]
웹인용
JWT: Signature vs MAC attacks
https://snikt.net/bl[...]
2019-05-27
[94]
웹인용
Obscure JWT Security Vulnerabilities
https://rodarmer.squ[...]
rodarmer.com
2019-07-21
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com