TIL58. HTTP : JWT(JSON Web Token)

ID์งฑ์žฌยท2021๋…„ 10์›” 26์ผ
2

HTTP

๋ชฉ๋ก ๋ณด๊ธฐ
7/17
post-thumbnail
post-custom-banner

๐Ÿ“Œ ์ด ํฌ์ŠคํŒ…์—์„œ๋Š” HTTP์˜ ์ธ๊ฐ€ ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜์ธ JWT์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.



๐ŸŒˆ JWT(JSON Web Token)

๐Ÿ”ฅ ์ธ๊ฐ€(Authorization)๋Š” ์™œ ํ•„์š”ํ• ๊นŒ?

๐Ÿ”ฅ ์ธ๊ฐ€(Authorization)์—๋Š” ์–ด๋–ค ๋ฐฉ์‹์„ ์ด์šฉํ• ๊นŒ?

๐Ÿ”ฅ Access_Token & Refresh_Token ์ด๋ž€?



1. ์ธ๊ฐ€(Authorization)๋Š” ์™œ ํ•„์š”ํ• ๊นŒ?

๐Ÿค” ์ธ์ฆ(Authentication)๊ณผ ์ธ๊ฐ€(Authorization)

โœ”๏ธ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ๊ณ„์ •์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋กœ๊ทธ์ธํ•˜๋Š” ๊ฒƒ์„ ์ธ์ฆ์ด๋ผํ•˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ๋ฉ”์ผํ•จ์— ๋“ค์–ด๊ฐ€๊ณ , ์ž์‹ ์ด ์“ด ๊ธ€์„ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ์ธ์ฆ ์ƒํƒœ์—์„œ ์–ด๋– ํ•œ ๊ถŒํ•œ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ธ๊ฐ€์˜ ๊ฐœ๋…์ด๋‹ค.

โœ”๏ธ ๋กœ๊ทธ์ธ์ด๋ผ๋Š”๊ฒŒ ๋ณด์•ˆ์— ์ง๊ฒฐ๋˜๋ฉด์„œ๋„ ์‚ฌ์šฉ์ž๋“ค์ด ๋ถˆํŽธํ•˜์ง€ ์•Š๋„๋ก ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž๋Š” ์ธ์ฆ๊ณผ ์ธ๊ฐ€๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผํ• ์ง€ ๊ณ ๋ฏผ์„ ๊ฐ€์งˆ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

โœ”๏ธ ๋Œ€ํ‘œ์ ์ธ ์ธ๊ฐ€(Authorization) ๋ฐฉ์‹์€ Session์ด๋‚˜ JWT์œผ๋กœ ๋‚˜๋‰œ๋‹ค.



2. ์ธ๊ฐ€(Authorization)์—๋Š” ์–ด๋–ค ๋ฐฉ์‹์„ ์ด์šฉํ• ๊นŒ?

๐Ÿค” Session์ด๋ž€?

โœ”๏ธ ์„ธ์…˜์€ ์„ธ์…˜ ID๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์–ด๋–ค ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋ฒ„์˜ ๋กœ๊ทธ์ธ ๋˜์–ด์žˆ์Œ์ด ์ง€์†๋˜๋Š” ์ด ์ƒํƒœ๋ฅผ ์„ธ์…˜ ๋ฐฉ์‹์ด๋ผ ํ•œ๋‹ค.

โœ”๏ธ ์„ธ์…˜์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์„ ํ–‡์„ ๋•Œ, ์ด๋ฅผ ์ธ์ฆํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œ๋ฅผ ๋ฐ˜์œผ๋กœ ์ž˜๋ผ์„œ ํ•˜๋‚˜๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด๋‚ด ์›น๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฟ ํ‚ค ์ •๋ณด๋กœ ๊ฐ–๊ณ , ํ•˜๋‚˜๋Š” ์„œ๋ฒ„๊ฐ€ ๊ฐ–๊ณ  ์žˆ์Œ์œผ๋กœ์จ ์ด๋ฅผ ๋Œ€์กฐํ•ด๋ณด๋Š” ๋ฐฉ์‹์œผ๋กœ ์ธ๊ฐ€๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

โœ”๏ธ ์„œ๋ฒ„๋Š” ์ด ๋ฐ˜์ชฝ์งœ๋ฆฌ ํ‹ฐ์ผ“์„ ๋ฉ”๋ชจ๋ฆฌ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•ด ๋‘๋Š”๋ฐ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋ฉด ๋น ๋ฅด์ง€๋งŒ ์„œ๋ฒ„๊ฐ€ ์žฅ์• ๊ฐ€ ์ƒ๊ฒจ ์žฌ๋ถ€ํŒ…๋˜์•ผํ•˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊ธฐ๋ฉด ์„œ๋ฒ„์—์„œ ์„ธ์…˜์ •๋ณด๋ฅผ ๋ชจ๋‘ ์žƒ์–ด๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์žˆ๋‹ค.

โœ”๏ธ ์„œ๋ฒ„์˜ ๋‹ค๋ฅธ ์ €์žฅ์žฅ์น˜๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์„ธ์…˜์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ์†๋„๊ฐ€ ๋Š๋ฆด ๋ฟ ์•„๋‹ˆ๋ผ ์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ๋Œ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” HTTP์˜ Stateless, Connectionless์˜ ํŠน์ง• ๋•Œ๋ฌธ์— ๊ตฌํ˜„ํ•˜๊ธฐ ๊นŒ๋‹ค๋กญ๋‹ค.

โœ”๏ธ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋ ˆ๋””์Šค๋‚˜ MemCached ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌํ˜• ๊ณต์šฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„๋ฅผ ๋‘ฌ์„œ ์ด๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ๋„ ํ•˜์ง€๋งŒ, ์ด ๋˜ํ•œ ์„œ๋ฒ„์˜ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์„ธ์…˜ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์–ด๋ ค์šด ๋‹จ์ ์„ ๊ฐ–๊ณ  ์žˆ๋‹ค.

โœ”๏ธ ์ฆ‰, ์„œ๋ฒ„์ธก์˜ ๋ณต์žกํ•œ ๊ตฌ์„ฑ๊ณผ ํ™˜๊ฒฝ์—์„œ ์–ด๋–ค ์ƒํƒœ๋ฅผ ๊ธฐ์–ตํ•ด์•ผ๋Š” ์–ด๋ ค์›€ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋ถ€๋‹ด์„ ๋‚ฎ์ถ”๊ณ ์ž ๊ณ ์•ˆ๋œ ๊ฒƒ์ด Token ๋ฐฉ์‹์ธ JWT๋‹ค.

๐Ÿค” JWT(JSON Web Token)

โœ”๏ธ JWT ๋˜ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด ์ธ๊ฐ€๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ์–ด๋–ค ํ‘œ๋ฅผ ์ฃผ๋Š”๋ฐ ์ด๋ฒˆ์—๋Š” ๋ฐ˜์œผ๋กœ ์ฐข์ง€์•Š๊ณ  ๊ทธ๋ƒฅ ์ค€๋‹ค. ์ด๋•Œ ์ด ํ‘œ๋ฅผ Token์ด๋ผํ•˜๊ณ , ๋ฐ˜์œผ๋กœ ์ฐข์ง€์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์€ ์„œ๋ฒ„๊ฐ€ ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

โœ”๏ธ ์ด ํ† ๊ทผ์€ ์ธ์ฝ”๋”ฉ ๋˜๋Š” ์•”ํ˜ธ๋œ 3๊ฐ€์ง€ ๋ฐ์ดํ„ฐ๋กœ ์ด๋ค„์ ธ์žˆ๋Š”๋ฐ, ์ด 3๊ฐœ์˜ ์˜์—ญ์„ header, payload, signature๋ผ ํ•˜๊ณ  ๋งˆ์นจํ‘œ 2๊ฐœ๋กœ ๋‚˜๋ˆ ์ ธ ์žˆ๋‹ค.

โœ”๏ธ ์ด ์ค‘ payload๋ฅผ Base64 ๋ฐฉ์‹์œผ๋กœ ๋””์ฝ”๋”ฉํ•ด๋ณด๋ฉด ๋ˆ„๊ฐ€ ๋ˆ„๊ฐ€์—๊ฒŒ ๋ฐœ๊ธ‰ํ–ˆ๋Š”์ง€, ์–ธ์ œ๊นŒ์ง€ ์œ ํšจํ•œ์ง€, ์‚ฌ์šฉ์ž์˜ id๋ฒˆํ˜ธ, ๊ด€๋ฆฌ์ž์—ฌ๋ถ€ ๋“ฑ์ด JSONํ˜•์‹์œผ๋กœ ๋“ค์–ด์žˆ๋‹ค.

โœ”๏ธ ์ด์— ์ด๋Ÿฐ token์„ ๋ฐœ๊ธ‰ํ•˜๋ฉด ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ๋งˆ๋‹ค ์ผ์ผ์ด ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋’ค์ ธ๋ด์•ผํ•  ์ผ์„ ์ค„์–ด๋“ค์ง€๋งŒ, Base64๋กœ ์ธ์ฝ”๋”ฉ ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๋””์ฝ”๋”ฉํ•˜์—ฌ ์•…์˜ํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค.

โœ”๏ธ ๋•Œ๋ฌธ์— header๋ถ€๋ถ„๊ณผ signature ๋ถ€๋ถ„์ด ํ•จ๊ป˜ ์žˆ๋‹ค. header๋ฅผ ๋””์ฝ”๋”ฉํ•ด๋ณด๋ฉด typ์ด ์กด์žฌํ•˜๋Š”๋ฐ ์ด๋Š” ๊ณ ์ •๊ฐ’์ด๊ณ , alg๋Š” signature๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์—ฌ๋Ÿฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ง€์ •๋˜์–ด ์žˆ๋‹ค.

โœ”๏ธ ์ฆ‰, payload ๊ฐ’๊ณผ ์„œ๋ฒ„์— ๊ฐ์ถฐ๋…ผ SECRET_KEY๋ฅผ header์˜ alg ๋ฐฉ์‹์œผ๋กœ ์ƒ์„ฑํ•œ ๊ฒƒ์ด signature์ด๋‹ค. ๋”ฐ๋ผ์„œ JWT์˜ ์•”ํ˜ธํ™” ๋ฐฉ์‹์€ ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด์ ธ์„œ๋Š” ๋ณตํ˜ธํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ๊ณ„์‚ฐ์ด ์–ด๋ ต๋‹ค.

โœ”๏ธ ์ด์— JWT๋Š” ์„œ๋ฒ„์—์„œ ์ƒํƒœ ์œ ์ง€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Stateless์˜ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , Sesstion์€ ๋ฐ˜๋Œ€๋กœ Statefulํ•œ ํŠน์ง•์„ ๊ฐ–๊ณ  ์žˆ๋‹ค.



3. Access_Token & Refresh_Token ์ด๋ž€?

๐Ÿค” JWT์˜ ํ•œ๊ณ„

โœ”๏ธ JWT๋Š” ์ด๋Ÿฌํ•œ ์žฅ์ ์ด ์žˆ์ง€๋งŒ, Session์„ ๋Œ€์ฒดํ•˜๊ธฐ์—๋Š” JWT์—๋„ ํ•œ๊ณ„๊ฐ€ ์กด์žฌํ•œ๋‹ค.

โœ”๏ธ Session์€ ๋ถ€๋‹ด์ด ์กด์žฌํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์ง€๋งŒ, Statefulํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์–ตํ•˜๋Š” ๋Œ€์ƒ์˜ ์ƒํƒœ๋“ค์„ ์–ธ์ œ๋“  ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด, ํ•œ ๊ธฐ๊ธฐ์—๋งŒ ๋กœ๊ทธ์ธ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ๋””๋ฐ”์ด์Šค๋กœ ์ ‘์†ํ•˜๋ฉด ํ•œ ์„ธ์…˜์„ ์ข…๋ฃŒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

โœ”๏ธ ์ด์— ๋ฐ˜ํ•ด JWT๋Š” ์–ด๋”˜๊ฐ€ ๊ธฐ๋กํ•˜๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ„ํŽธํ•˜๊ธดํ•˜์ง€๋งŒ ํ†ต์ œํ•˜๊ธด ์–ด๋ ต๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•ด์ปค๊ฐ€ ํ† ํฐ์„ ํƒˆ์ทจํ•œ ๊ฒฝ์šฐ ์ด๋ฅผ ๋ฌดํšจํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค.

๐Ÿค” access_token & refresh_token ์ด๋ž€?

โœ”๏ธ ์ด๋Ÿฌํ•œ JWT์˜ ํ•œ๊ณ„๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ ์‹œ, 2๊ฐœ์˜ ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ˆ˜๋ช…์ด ๋ช‡ ์‹œ๊ฐ„์ด๋‚˜ ๋ช‡๋ถ„ ์ดํ•˜๋กœ ์งง์€ access_token๊ณผ ๋ณดํ†ต 2์ฃผ์ •๋„๋กœ ๊ธฐ๊ฐ„์ด ์žกํ˜€ ์žˆ๋Š” refresh_token์ด๋‹ค.

โœ”๏ธ ์„œ๋ฒ„๋Š” refresh_token๊ณผ ์ƒ์‘ํ•˜๋Š” ๊ฐ’์„ ์ €์žฅํ•ด ๋‘๋Š”๋ฐ, ํด๋ผ์ด์–ธํŠธ์—์„œ access_token์˜ ๋งŒ๋ฃŒ๊ธฐ๊ฐ„์ด ์ง€๋‚˜ refresh_token์„ ์ „์†กํ•˜๋ฉด ๊ทธ๊ฑธ ์„œ๋ฒ„์— ์ €์žฅ๋œ ๊ฐ’๊ณผ ๋Œ€์กฐํ•˜๊ณ  ๋งž๋‹ค๋ฉด ์ƒˆ๋กœ์šด access_token์„ ๋ฐœ๊ธ‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

โœ”๏ธ ์ด์ œ refresh_token๋งŒ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌ๋œ๋‹ค๋ฉด ์ด๊ฒŒ ์œ ํšจํ•  ๋™์•ˆ์€ access_token์ด ๋งŒ๋ฃŒ๋  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ๋กœ๊ทธ์ธํ•  ํ•„์š” ์—†์ด ์ธ๊ฐ€๋ฅผ ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค.

โœ”๏ธ ์ฆ‰, ๋งค๋ฒˆ ์ธ๊ฐ€๋ฅผ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” access_token๊ณผ access_token์˜ ์œ ํšจ๊ธฐ๊ฐ„์ด ์ง€๋‚ฌ์„ ๋•Œ ์žฌ๋ฐœ๊ธ‰ ๋ฐ›๊ธฐ ์œ„ํ•œ refresh_token์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

โœ”๏ธ ๋˜ํ•œ ์„œ๋ฒ„์—์„œ ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ๊ฐ•์ œ๋กœ ๋กœ๊ทธ์•„์›ƒ ์‹œํ‚จ๋‹ค๋˜์ง€ ํ† ํฐ์„ ๋ฌดํšจ๊ณผ์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด refresh_token์„ DB์—์„œ ์ง€์›Œ์„œ ํ† ํฐ ๊ฐฑ์‹ ์ด ์•ˆ๋˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ, ์ด๋Š” token์˜ ํ•œ๊ณ„์ ์„ ๋ถ€๋ถ„์ ์œผ๋กœ ๋ณด์™„ํ•œ๊ฒƒ ๋ฟ์ด์ง€ ์™„์ „ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ์•„๋‹ˆ๋‹ค.

profile
Keep Going, Keep Coding!
post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€