๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“  archive

JWT (JSON Web Token)

by HandHand 2022. 5. 23.

๐Ÿ“Œ JWT ๋ž€?

JWT๋Š” JSON ํฌ๋งท์„ ์ด์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์†์„ฑ์„ ์ €์žฅํ•˜๋Š” claim ๊ธฐ๋ฐ˜์˜ web token ์ž…๋‹ˆ๋‹ค.

ํ† ํฐ ์ž์ฒด๋ฅผ ์ •๋ณด๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— self-contained ๋ฐฉ์‹ ์ด๋ผ๊ณ  ํ•˜๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

JWT ๋™์ž‘ ๋ฐฉ์‹

 

JWT์—๋Š” ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ํ† ํฐ์— ํฌํ•จํ•˜๊ธฐ ๋•Œ๋ฌธ์—

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ฐ™์€ ์„œ๋ฒ„์™€์˜ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ์˜ค๋ฒ„ ํ—ค๋“œ๋ฅผ ์ตœ์†Œํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์„œ๋ฒ„๋Š” JWT ์ƒ์„ฑ ์‹œ JWT ์— ๊ฒ€์ฆ์ด๋‚˜ ๊ถŒํ•œ ์ธ๊ฐ€ ์‹œ ํ•„์š”ํ•œ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์—

JWT ์— ๋Œ€ํ•œ ์ƒํƒœ๋ฅผ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์•„ stateless ํ•œ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ“Œ JWT ๊ตฌ์กฐ

JWT ๋Š” header , payload , signature ์„ธ ๊ฐ€์ง€๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ ๋ถ€๋ถ„์€ base64-URLSAFE ๋กœ ์ธ์ฝ”๋”ฉ ๋˜์–ด ํ‘œํ˜„๋˜๋ฉฐ . ๊ตฌ๋ถ„์ž๋ฅผ ํ†ตํ•ด ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

 

HEADER.PAYLOAD.SIGNATURE
๐Ÿ’ก Base64 URL Safe Encoding ์ด๋ž€?

๊ธฐ๋ณธ Base64 ์ธ์ฝ”๋”ฉ์—์„œ +(plus)๋Š” -(minus)๋กœ, /(slash)๋Š” _(underscore)๋กœ๋Œ€์ฒด๋œ ์ธ์ฝ”๋”ฉ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
์ด๋กœ ์ธํ•ด์„œ JWT๋Š” ์„ค๊ณ„ ์˜๋„๋Œ€๋กœ URL, Cookie, Header ๋“ฑ์–ด๋””์—์„œ๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๋„“์€ ๋ฒ”์šฉ์„ฑ์„ ๊ฐ€์ง€๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

HEADER ์—๋Š” ํ† ํฐ์˜ ํƒ€์ž…๊ณผ ํ•ด์‹œ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

PAYLOAD ์—๋Š” ํ† ํฐ์—์„œ ์‚ฌ์šฉํ•  ์ •๋ณด์˜ ์กฐ๊ฐ๋“ค์ธ ํด๋ ˆ์ž„(claim) ์ด ๋‹ด๊ฒจ ์žˆ์Šต๋‹ˆ๋‹ค.

 

claim ์€ key-value ์Œ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ ํ† ํฐ์—๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ํด๋ ˆ์ž„์„ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SIGNATURE ๋Š” HEADER ์™€ PAYLOAD ๋ฅผ ํ•ฉ์นœ ๋ฌธ์ž์—ด์„ ์„œ๋ช…ํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค.

 

๐Ÿ“Œ JWS ? JWE ?

JWT ๋ฅผ ์ด์šฉํ•œ ์„œ๋ช… ์ด๋‚˜ ์•”ํ˜ธํ™” ์— ๋Œ€ํ•œ ๋ช…์„ธ๋Š” JWT ํ•˜์œ„ JWS ์™€ JWE ์— ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ JWT๋Š” JWS ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ 

JWS Compact Serialization ์œผ๋กœ ์ง๋ ฌํ™” ํ•œ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

 

์ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ†ต์‹  ์‹œ ๊ตฌ๊ฐ„ ์•”ํ˜ธํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด TLS๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—

JWE๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

JWS ๋Š” JSON ์œผ๋กœ ์ „์ž ์„œ๋ช…์„ ํ•˜์—ฌ URL-SAFE ๋ฌธ์ž์—ด๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ ์ด๋ฉฐ

JWE ๋Š” JSON์„ ์•”ํ˜ธํ™”ํ•˜์—ฌ URL-SAFE ๋ฌธ์ž์—ด๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ ์„œ๋ช… ์€ ์„œ๋ช…ํ•  ๋•Œ ์‚ฌ์šฉํ•œ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด์„œ

JSON ์ด ์†์ƒ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋งŒ์•ฝ ์šฐ๋ฆฌ์˜ JWS ๊ฐ€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด

์ด๋ฅผ JWE ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋˜ ํ•œ๋ฒˆ ์•”ํ˜ธํ™”ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ

์ธ์ฆ ํ† ํฐ๊ณผ ๊ฐ™์€ ์‹œ์Šคํ…œ์—์„œ JWE ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋„Œ์„ผ์Šค์ž…๋‹ˆ๋‹ค.

 

๐Ÿ“Œ JWT ์˜ ๋‹จ์  ๋ฐ ๊ณ ๋ ค ์‚ฌํ•ญ

self-contained ์ด๊ธฐ ๋•Œ๋ฌธ์— ์–‘๋‚ ์˜ ๊ฒ€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

payload ๊ฐ€ ๊ธธ์–ด์ง€๋ฉด ๋„คํŠธ์›Œํฌ์— ๋ถ€ํ•˜๋ฅผ ์ค„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

payload ์ž์ฒด๋Š” base64 ๋กœ ์ธ์ฝ”๋”ฉ ๋˜์–ด ์žˆ์ง€๋งŒ ์•”ํ˜ธํ™” ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ์„œ ์ค‘๊ฐ„์— ํƒˆ์ทจํ•ด ๋””์ฝ”๋”ฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

stateless ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•œ๋ฒˆ ๋งŒ๋“ค์–ด์ง€๋ฉด ์ œ์–ด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ํ† ํฐ์€ ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ† ํฐ์„ ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

Bearer Token

์ผ๋ฐ˜์ ์œผ๋กœ ํ† ํฐ์€ ์š”์ฒญ ํ—ค๋”์˜ Authorization ํ•„๋“œ์— ๋‹ด์•„์ ธ ๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค.

Authorization: <type> <credentials>

bearer ๋Š” ์œ„ ํ˜•์‹์—์„œ <type> ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ type ์ด ์กด์žฌํ•˜๋ฏ€๋กœ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

(JWT ํ˜น์€ OAuth์— ๋Œ€ํ•œ ํ† ํฐ์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.)

 

๐Ÿ“Œ ์ฐธ๊ณ ์ž๋ฃŒ

JWT๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. : TOAST Meetup

JWT (JSON Web Token) ์ดํ•ดํ•˜๊ธฐ์™€ ํ™œ์šฉ ๋ฐฉ์•ˆ - Opennaru, Inc.

[Server] JWT(Json Web Token)๋ž€?

ํ† ๊ทผ ๊ธฐ๋ฐ˜ ์ธ์ฆ์—์„œ bearer๋Š” ๋ฌด์—‡์ผ๊นŒ?

What are the pros/cons of using JWE or JWS

๋ฐ˜์‘ํ˜•

๐Ÿ’ฌ ๋Œ“๊ธ€