[์ •๋ณด๋ณด์•ˆ] JWT(JSON Web Token) ์ด๋ž€?

2022. 4. 11. 02:10ใ†์ด๋ก  ์ •๋ฆฌ/์ •๋ณด๋ณด์•ˆ

728x90
๋ฐ˜์‘ํ˜•

 

๐Ÿš€ JWT(JSON Web Token)

    ๐Ÿ”ฝ  ๊ฐœ์š”

์ด์šฉ์ž๊ฐ€ Login์„ ํ• ๋•Œ, ํ•ด๋‹น ํšŒ์›์˜ ๊ณ ์œ ํ•œ Token์„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š”๋ฐ, ๊ทธ๋•Œ `JWT`๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด์—์š”.

์ธ์ฆ์—๋Š” ๋Œ€ํ‘œ์  3์ธ๋ฐฉ์ด ์žˆ๋Š”๋ฐ, `Cookie, Session, Token` ๋ฐฉ์‹์ด ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

JWT๋Š” ๋‹น์‚ฌ์ž๊ฐ„์— ์ •๋ณด๋ฅผ `JSON` ๊ฐ์ฒด๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€๋ณ๊ณ , ๋…๋ฆฝ์ ์ธ ๋ฐฉ์‹์„ ์ •์˜ํ•˜๋Š” ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€(RFC 7519)์ธ ๊ฒƒ์ด์—์š”. ์ด ์ •๋ณด๋Š” `Digital Sign` ๊ฐœ๋…์ด ๋“ค์–ด๊ฐ€ ์žˆ์–ด ํ•ด๋‹น ๊ฐ’์„ ํ™•์ธํ•˜๊ณ , ์ƒ๋Œ€๋ฐฉ์ด ๋ณด๋ƒˆ๋‹ค๋Š” ๊ฒƒ์„ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

์ข€ ๋” ๊ฐ„๋‹จํžˆ ์ด์•ผ๊ธฐํ•˜๋ฉด ์ •๋ณด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ํšŒ์›์˜ ๊ถŒํ•œ ๊ฐ™์€ ๊ฒƒ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์นœ๊ตฌ์ธ ๊ฒƒ์ด์—์š”.

 

 

JWT ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€

 

 

 

        ๐Ÿ“ฆ ๊ตฌ์กฐ

JWT ๊ตฌ์กฐ

๋ฐ˜์‘ํ˜•

JWT๋Š” ์œ„์™€ ๊ฐ™์ด ์ƒ๊ธด ๊ฒƒ์ด์—์š”. ํฌ๊ฒŒ ์„ธ๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„์ด ๋˜๋Š” ๊ฒƒ์ด์—์š”.

`Header`๋Š” Token์— ๋Œ€ํ•œ `Meta Data`๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

`Meta Data`์•ˆ์—๋Š” `์•”ํ˜ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ข…๋ฅ˜(SHA256, RSA ๋“ฑ๋“ฑ)`์™€ `Type`์ด ๋“ค์–ด ์žˆ๋Š” ๊ฒƒ์ด์—์š”. 

 

`Payload`๋Š” `ํšŒ์› ์ •๋ณด(Issuer)`, `๋งŒ๋ฃŒ ๊ธฐ๊ฐ„(Expiration Time)`, `์ฃผ์ œ(Subject)` ๋“ฑ๋“ฑ์ด ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

์ฆ‰ ๊ฐ€์žฅ ์ค‘์š”ํ•œ Data๊ฐ€ ๋‹ด๊ธฐ๋Š” ๋ถ€๋ถ„์ธ ๊ฒƒ์ด์—์š”.

 

`Verify Signature`๋Š” JWT์˜ ๋งˆ์ง€๋ง‰ ์„ธ๊ทธ๋จผํŠธ์ธ๋ฐ, Token์„ ๋ณด๋‚ธ ์‚ฌ๋žŒ์— ์˜ํ•ด ์ „์ž ์„œ๋ช…์ด ๋˜์—ˆ์œผ๋ฉฐ, ์–ด๋–ค ์‹์œผ๋กœ๋“  ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด์—์š”.

์„œ๋ช…์€ `Header`, `Payload`, `์•”ํ˜ธํ™”ํ•  ๊ฐ’`์„ ์ด์šฉํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์ด์—์š”.

 

 

        ๐Ÿ“ฆ JWT ์‚ฌ์šฉ ํ๋ฆ„

์ตœ์ดˆ ํšŒ์›์ด Login์„ ํ•˜๋ฉด Token์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, `Payload` ๋ถ€์— ํšŒ์› ์ด๋ฆ„, ํšŒ์› ์—ญํ• , Token ์ƒ์„ฑ์ผ์‹œ, Token ๋งŒ๋ฃŒ ์ผ์‹œ์™€ ํ•จ๊ป˜ ์•”ํ˜ธํ™”์— ์‚ฌ์šฉ๋  Key ๊ฐ’(ํ‰๋ฌธ)์„ ํ•ฉ์ณ์„œ `Hash` ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ์•”ํ˜ธํ™” ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

์–ด๋–ค ์ด์šฉ์ž๊ฐ€ ๊ด€๋ฆฌ์ž๋งŒ ๋ณด๊ณ  ์‹ถ์€ ๋‚ด์šฉ์„ ๋ณด๋ ค๊ณ  ํ•  ๋•Œ์™€ ๊ด€๋ฆฌ์ž๊ฐ€ ํ•ด๋‹น ๋‚ด์šฉ์„ ๋ณด๋ ค๊ณ  ํ•  ๋•Œ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ• ๊นŒ์š”?

์ตœ์ดˆ Client์—์„œ๋Š” ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ๋ณด๊ด€ํ•˜๊ณ  ์žˆ๋˜ Token(Login์‹œ ๋ฐœํ–‰)์„ `HTTP Request Header`์— ๋„ฃ์–ด ํ•จ๊ป˜ Server์—๊ฒŒ ๋ณด๋‚ด๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์—์š”.

Server๋Š” ํ•ด๋‹น ๊ฐ’์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด Token์„ ๋‹ค์‹œ ๋งŒ๋“ค์–ด ๋‘ ๊ฐœ๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด์—์š”.

์ด๋•Œ ์š”์ฒญ์œผ๋กœ ๋“ค์–ด์˜จ `JWT Header`์™€ `JWT Payload`๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  Server์•ˆ์— ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ๋น„๋ฐ€๊ฐ’์„ ์ด์šฉํ•ด์„œ `Signature` ๋ถ€๋ถ„์„ ๋‹ค์‹œ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด์—์š”.

๊ทธ๋ž˜์„œ ๊ฐ’์ด ๋งž๋‹ค๋ฉด ๊ด€๋ฆฌ์ž๋ผ๊ณ  ํŒ๋‹จํ•˜๊ณ  ํ•ด๋‹น ๋‚ด์šฉ์„ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๊ณ , ์•„๋‹ˆ๋ฉด ๊ด€๋ฆฌ์ž๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ํŒ๋‹จํ•˜๊ณ , ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์„ ๋ณด์ง€ ๋ชปํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

 

 

    ๐Ÿ”ฝ ์ƒ์„ธ ๋‚ด์šฉ

        ๐Ÿ“ฆ Access Token๊ณผ Refresh Token ์ด์•ผ๊ธฐ

JWT (Json Web Token)๋Š” ์ธ์ฆ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํ† ํฐ ํ˜•์‹์œผ๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ํ† ํฐ์„ ์‚ฌ์šฉํ•ด์š”.
๋ฐ”๋กœ Access Token๊ณผ Refresh Token์ด์—์š”.

์ข…    ๋ฅ˜ ์—ญ    ํ•  ํŠน      ์ง•
Access Token ์ฃผ๋กœ Client๊ฐ€ ๋ณดํ˜ธ๋œ ์ž์›(Resource) ์ ‘๊ทผ ์‹œ ์‚ฌ์šฉ โœ… ์งง์€ ์œ ํšจ ๊ธฐ๊ฐ„์„ ๊ฐ€์ง€๋ฉฐ, ๋ณดํ†ต ๋ช‡ ๋ถ„์—์„œ ๋ช‡ ์‹œ๊ฐ„ ์ •๋„๋กœ ์„ค์ •.

โœ… Client๊ฐ€ Server์— Loginํ•˜์—ฌ ์ธ์ฆ ๋ฐ›์€ ๋’ค ๋ฐœ๊ธ‰.

โœ… Client๋Š” Access Token์„ HTTP Header๋‚˜, Query Parameter ๋“ฑ์„ ํ†ตํ•ด Server์— ์ œ์‹œํ•˜์—ฌ ๋ณดํ˜ธ๋œ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์ฆ.

โœ… ์ฃผ๋กœ ์ธ๊ฐ€(Authorization) Server์—์„œ ๋ฐœ๊ธ‰.
Refresh Token Access Token ๋งŒ๋ฃŒ ์‹œ Refresh Token์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด Access Token ๋ฐœ๊ธ‰ โœ… Access Token ๋ณด๋‹ค ๊ธด ์œ ํšจ ๊ธฐ๊ฐ„์„ ๊ฐ€์ง€๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ˆ˜์ผ์—์„œ ์ˆ˜์ฃผ์ผ ์ •๋„ ์„ค์ •.

โœ… Access Token ๋งŒ๋ฃŒ ํ˜น์€ ๊ฐฑ์‹  ํ•„์š”์‹œ ์‚ฌ์šฉ.

โœ… ์ฃผ๋กœ ์ธ๊ฐ€(Authorization) Server์—์„œ ๋ฐœ๊ธ‰.

โœ… ๋ณด์•ˆ ์ƒ ์ค‘์š”ํ•œ ์ •๋ณด์ด๋ฏ€๋กœ, ์•ˆ์ „ํ•œ ์ €์žฅ์†Œ(๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ๋“ฑ)์— ์ €์žฅ.


์‚ฌ์‹ค JWT๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, Refresh Token์„ ๊ตฌํ˜„ํ•˜๋ƒ ๋งˆ๋ƒ์— ๋Œ€ํ•ด ๊ฐ‘๋ก ์„๋ฐ•์ด ์กด์žฌํ•˜๊ณ  ์žˆ์–ด์š”. ๊ทธ๋ ‡๋‹ค๋ฉด Refresh Token์˜ ์žฅ, ๋‹จ์ ์€ ๋ฌด์—‡์ด ์žˆ์„๊นŒ์š”?

์žฅ      ์  ๋‹จ        ์ 
1. Access Token์˜ ์งง์€ ์œ ํšจ ๊ธฐ๊ฐ„์œผ๋กœ ์ธํ•ด Access Token ๋งŒ๋ฃŒ ์‹œ์—๋„ Refresh Token์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด Access Token์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

2. ์ด์šฉ์ž ๋ฐ ์‚ฌ์šฉ์ž๋Š” ์œ„์˜ ์ด์œ ๋กœ ์ž์ฃผ Login์„ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
1. ๋ณด์•ˆ ์ƒ ์ฃผ์˜๊ฐ€ ๋”์šฑ ํ•„์š”. Refresh Token์ด ๋…ธ์ถœ๋˜๊ฒŒ ๋  ๊ฒฝ์šฐ ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ„์†ํ•ด์„œ ์ƒˆ๋กœ์šด Access Token์„ ๋ฐœ๊ธ‰ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ.

2. Refresh Token์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ฃผ๊ธฐ์ ์œผ๋กœ ๊ฐฑ์‹ ์ด๋‚˜, ํšŒ์ˆ˜ ์ •์ฑ…์„ ์„ค์ •ํ•˜์—ฌ ๋ณด์•ˆ ๊ฐ•ํ™”์— ๋Œ€ํ•œ ๋…ธ๋ ฅ ํ•„์š”.


์œ„์˜ ๋‚ด์šฉ๋“ค๋กœ ์ธํ•ด Refresh Token์˜ ์‚ฌ์šฉ ์—ฌ๋ถ€๋Š” ๋ณด์•ˆ ์š”๊ฑด, ์ด์šฉ์ž ํ˜น์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๋ฐ Application์˜ ํŠน์ • ์š”๊ตฌ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์ ์šฉํ• ์ง€ ๋ง์ง€๊ฐ€ ๊ฒฐ์ •๋˜๊ฒŒ ๋ผ์š”.

Refresh Token์„ ์•ˆ์ „ํ•œ ์ €์žฅ์†Œ์— ๋ณด์•ˆ์ ์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ณ , ์ ์ ˆํ•œ ๊ฐฑ์‹  ๋ฐ ํšŒ์ˆ˜ ์ •์ฑ…์ด ์ ์šฉ๋œ๋‹ค๋ฉด Refresh Token์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ํšจ์œจ์ ์ธ ์ธ์ฆ/์ธ๊ฐ€ ๊ตฌํ˜„ ๋ฐฉ์•ˆ์ผ ์ˆ˜ ์žˆ์–ด์š”.

๋‹ค๋งŒ, ์ ์ ˆํ•œ ๊ด€๋ฆฌ ์—†์ด ์‚ฌ์šฉ๋  ๊ฒฝ์šฐ ๋ณด์•ˆ ์œ„ํ˜‘์ด ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ด์š”.

 

 

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•