๊ด€๋ฆฌ ๋ฉ”๋‰ด

Tech Log ๐Ÿ› ๏ธ

์ธ์ฆ, ์ธ๊ฐ€ ๋ฐฉ์‹์˜ ์ข…๋ฅ˜ - ์ฟ ํ‚ค , ์„ธ์…˜ , JWT(Json Web Token) ๋ณธ๋ฌธ

Computer Science/๋„คํŠธ์›Œํฌ

์ธ์ฆ, ์ธ๊ฐ€ ๋ฐฉ์‹์˜ ์ข…๋ฅ˜ - ์ฟ ํ‚ค , ์„ธ์…˜ , JWT(Json Web Token)

sehaan 2024. 2. 29. 13:17

1. ์ฟ ํ‚ค ์ธ์ฆ ๋ฐฉ์‹

์ฟ ํ‚ค๋ž€ ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ๋ธŒ๋ผ์šฐ์ €์— key value ํ˜•ํƒœ๋กœ ์ €์žฅํ•ด๋†“๋Š” ์ž‘์€ ๊ธฐ๋กํŒŒ์ผ์ด๋‹ค.
์ฟ ํ‚ค๋ฅผ ์ด์šฉํ•˜์—ฌ์„œ ๊ฐ„๋‹จํ•œ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
 

์ฟ ํ‚ค ๋กœ๊ทธ์ธ ์ธ์ฆ ๋ฐฉ์‹
 

์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : https://brunch.co.kr/@jinyoungchoi95/1

 
ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•œ ์š”์ฒญ์„ ํ• ๋•Œ๋งˆ๋‹ค ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฟ ํ‚ค์— id, pw ์ •๋ณด๋ฅผ ๋‹ด์•„์„œ ์ „์†กํ•œ๋‹ค.
์œ„์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„์—์„œ๋Š” ์ด๋ฏธ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋กœ๊ทธ์ธ์ด ์ง„ํ–‰๋œ ํ›„ ์œ ์ € ์ •๋ณด๊ฐ€ ์ฟ ํ‚ค์— ๋“ค์–ด์žˆ์–ด์•ผํ•œ๋‹ค.
 
ํ•˜์ง€๋งŒ ์ฟ ํ‚ค ์ธ์ฆ ๋ฐฉ์‹์€ ์—ฌ๋Ÿฌ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.
1. ์ฟ ํ‚ค๊ฐ’ ์œ ํšจ์„ฑ ๊ฒ€์ฆ์ด ํž˜๋“ค๋‹ค. (์กฐ์ž‘ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.)
2. ์ค‘๊ฐ„์— ํƒˆ์ทจํ•ด์„œ id,pw ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
3. ์„œ๋ฒ„์—์„œ ๋งค๋ฒˆ ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•œ๋‹ค.
4. ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ์ฟ ํ‚ค ํ˜•์‹์ด ํ†ต์ผ๋˜์–ด ์žˆ์ง€ ์•Š์•„์„œ ๋ธŒ๋ผ์šฐ์ € ๊ฐ„ ๊ณต์œ ๊ฐ€ ์–ด๋ ต๋‹ค.
 
๋”ฐ๋ผ์„œ ์ฟ ํ‚ค๋งŒ ์ด์šฉํ•œ ์ธ์ฆ ๋ฐฉ์‹์˜ ํ•œ๊ณ„๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ์„ธ์…˜์„ ์‚ฌ์šฉํ•œ ์ธ์ฆ ๋ฐฉ์‹์ด ๋‚˜์˜ค๊ฒŒ ๋˜์—ˆ๋‹ค.
 

2. ์„ธ์…˜ ์ธ์ฆ ๋ฐฉ์‹

์„ธ์…˜์€ ์‚ฌ์šฉ์ž์˜ ์—ฐ๊ฒฐ์„ ํ•˜๋‚˜์˜ ์ƒํƒœ(์„ธ์…˜)์œผ๋กœ ์œ ์ง€์‹œํ‚ค๋Š” ๊ธฐ์ˆ ์„ ๋งํ•œ๋‹ค.
 

์„ธ์…˜ ๋กœ๊ทธ์ธ ์ธ์ฆ ๋ฐฉ์‹

์ฟ ํ‚ค๋Š” ๋งค๋ฒˆ id,pw ๊ฐ™์€ ๋ฏผ๊ฐ ์ •๋ณด๋ฅผ ์ „์†กํ•ด์•ผํ–ˆ๋‹ค๋ฉด, ์„ธ์…˜์€ ์„œ๋ฒ„์˜ ์„ธ์…˜ ์ €์žฅ์†Œ์— ์„ธ์…˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•จ์œผ๋กœ์จ ๋ณด์™„์„ ๊ฐ•ํ™”ํ–ˆ๋‹ค.
ํด๋ผ์ด์–ธํŠธ๋Š” ์ธ์ฆ์ด ํ•„์š”ํ•œ ์š”์ฒญ์„ ํ•„์š”ํ•  ๋•Œ ์ฟ ํ‚ค์— ์„ธ์…˜ ์ธ์ฆ ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ๋ณด๋‚ด๊ณ  ์„œ๋ฒ„๋Š” ์ด๋ฅผ ์„ธ์…˜ ์ €์žฅ์†Œ์˜ ๋‚ด์šฉ๊ณผ ๋น„๊ตํ•ด์„œ ์ธ์ฆ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•œ๋‹ค.
(๋งˆ์น˜ ๋งคํ‘œ์†Œ์—์„œ ํ‹ฐ์ผ“์˜ ์ ˆ๋ฐ˜์„ ๋–ผ์„œ ์†๋‹˜์ด๋ž‘ ๋‚˜๋ˆ ๊ฐ€์ง€๋Š” ์›๋ฆฌ์™€ ๋น„์Šทํ•˜๋‹ค.)
์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ์ธ์ฆ ์š”์ฒญ ์‹œ์— ๋ฏผ๊ฐ ์ •๋ณด๋ฅผ ๋„คํŠธ์›Œํฌ ์ƒ์— ๋…ธ์ถœ ์‹œํ‚ค๋Š” ๊ฒƒ์„ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ๋‹ค.
 
ํ•˜์ง€๋งŒ ์„ธ์…˜ ๋ฐฉ์‹๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ์•ˆ๊ณ  ์žˆ๋‹ค.
1. ์„œ๋ฒ„๊ฐ€ ์žฌ๋ถ€ํŒ…๋˜๋ฉด ์„ธ์…˜ ์ €์žฅ์†Œ๊ฐ€ ์ดˆ๊ธฐํ™”๋œ๋‹ค.
2. ์Šค์ผ€์ผ ์•„์›ƒ ๋ฐฉ์‹์˜ ํ™•์žฅ์ด ์–ด๋ ต๋‹ค. -> ๋ชจ๋“  ์„œ๋ฒ„์— ์„ธ์…˜ ์ •๋ณด๋ฅผ ๋™๊ธฐํ™” ์‹œ์ผœ์•ผํ•œ๋‹ค.
3. ์‚ฌ์šฉ์ž์˜ ์ˆ˜๊ฐ€ ๋งŽ์•„์ง€๋ฉด ๊ด€๋ฆฌํ•ด์•ผํ•˜๋Š” ์„ธ์…˜ ์ •๋ณด๊ฐ€ ๋งŽ์•„์ ธ์„œ ์„œ๋ฒ„์˜ ๋ถ€๋‹ด์ด ๋œ๋‹ค. -> ๋ฌด์ƒํƒœ(stateless) ์œ„๋ฐ˜
4. ์„ธ์…˜ ์ธ์ฆ ์ •๋ณด ํƒˆ์ทจ์˜ ์œ„ํ—˜์ด ์žˆ๋‹ค.
 

3. JWT ์ธ์ฆ ๋ฐฉ์‹ 

JWT(Json Web Token) ๋ฐฉ์‹์€ ํ† ํฐ ๊ธฐ๋ฐ˜์˜ ์ธ์ฆ ๋ฐฉ์‹์ด๋‹ค. ์ด ๋ฐฉ์‹์„ ํ†ตํ•ด ๊ทธ ๋™์•ˆ์˜ ์ธ์ฆ ๋ฐฉ์‹์—์„œ ๋‚˜์™”๋˜ ๋ฌธ์ œ๋“ค์„ ์–ด๋Š์ •๋„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
 

JWT ๋กœ๊ทธ์ธ ์ธ์ฆ ๋ฐฉ์‹

JWT ํ† ํฐ ๊ตฌ์กฐ๋Š” ํฌ๊ฒŒ 3๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.
 
header
ํ‚ค๊ฐ’, ํ† ํฐ ์œ ํ˜•, ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ™์€ ์ •๋ณด๋“ค์„ ๋‹ด๊ณ  ์žˆ๋‹ค.
 
payload
ํด๋ ˆ์ž„(claim)์ด๋ผ๊ณ  ํ•˜๋Š” ์œ ์ €์˜ ํ† ํฐ ์ธ์ฆ ์ •๋ณด๋ฅผ key/value ํ˜•ํƒœ๋กœ ๋‹ด๊ณ  ์žˆ๋‹ค.
JWT ์ŠคํŽ™์—์„œ๋Š” ํ‘œ์ค€ claim ๋ชฉ๋ก์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค. (๊ถŒ์žฅ ์‚ฌํ•ญ์ผ ๋ฟ ๊ผญ ์ง€ํ‚ฌ ํ•„์š”๋Š” ์—†์„ ๊ฒƒ ๊ฐ™๋‹ค)
 
iss (Issuer, ํ† ํฐ ๋ฐœ๊ธ‰์ž): . ๋ˆ„๊ฐ€ ํ† ํฐ์„ ๋ฐœ๊ธ‰(์ƒ์„ฑ)ํ–ˆ๋Š”์ง€
sub (Subject, ํ† ํฐ ์ฃผ์ œ): ์ฃผ์ œ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
aud (Audience, ํ† ํฐ ์ˆ˜์‹ ์ž): ๋ˆ„๊ตฌ์—๊ฒŒ ํ† ํฐ์ด ์ „๋‹ฌ๋˜๋Š” ๊ฐ€
exp (Expiration, ๋งŒ๋ฃŒ ์‹œ๊ฐ„): ์–ธ์ œ ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๋Š”์ง€
nbf (Not Before): ์ •์˜๋œ ์‹œ๊ฐ„ ์ดํ›„์— ํ† ํฐ์ด ํ™œ์„ฑ
iat (Issued At, ํ† ํฐ ๋ฐœ๊ธ‰ ์‹œ๊ฐ„): ์–ธ์ œ ํ† ํฐ์ด ๋ฐœ๊ธ‰๋˜์—ˆ๋Š”์ง€
jti (JWT ID, ํ† ํฐ ์‹๋ณ„์ž): ํ† ํฐ์˜ ๊ณ ์œ  ์‹๋ณ„์ž
 
signature
JWT์—์„œ ๊ฐ€์žฅ ๋ฏผ๊ฐํ•œ ๋ถ€๋ถ„์ด๋‹ค. ํ•ด๋‹น ๊ฐ’์œผ๋กœ ํ† ํฐ์˜ ์œ ํšจ์„ฑ์„ ํŒ๋ณ„ํ•˜๋ฉฐ ์ด๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์‹œํฌ๋ฆฟ ๊ฐ’์„ ์œ ์ถœ์‹œํ‚ค์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค.
์‹œํฌ๋‹ˆ์ฒ˜๋Š” ํ—ค๋”+ํŽ˜์ด๋กœ๋“œ+์‹œํฌ๋ฆฟ ๊ฐ’์„ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์•”ํ˜ธํ™”ํ•˜์—ฌ์„œ ๋งŒ๋“ค์–ด์ง„๋‹ค.
๋”ฐ๋ผ์„œ ์‹œํฌ๋ฆฟ ๊ฐ’์ด ์กฐ๊ธˆ์ด๋ผ๋„ ๋‹ค๋ฅด๋‹ค๋ฉด ํ† ํฐ ๋‚ด์šฉ์€ ์™„์ „ ๋ณ€ํ•˜๊ฒŒ ๋˜์–ด์„œ ์ธ์ฆ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.
 
์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ ์€ ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ๋Š” ์•”ํ˜ธํ™”๊ฐ€ ์•„๋‹Œ base64 ๋ฐฉ์‹์œผ๋กœ ์ธ์ฝ”๋”ฉ ๋˜๋Š” ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ์ œ3์ž๋„ ํ† ํฐ๋งŒ์œผ๋กœ๋„ ํ•ด๋‹น ๊ฐ’๋“ค์„ ์—ด๋žŒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‹๋ณ„์ž๋ฅผ ์ œ์™ธํ•œ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋“ค์„ ์ตœ๋Œ€ํ•œ ๋„ฃ์ง€ ๋ง์•„์•ผํ•œ๋‹ค!
 
JWT๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ํ† ํฐ์„ ์ฃผ๋Š” ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์•ฝ ํ† ํฐ์ด ํƒˆ์ทจ ๋‹นํ•œ๋‹ค๋ฉด ์„œ๋ฒ„์—์„œ ๋”ฑํžˆ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์—†๋‹ค.
์ด ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ์ด์šฉํ•ด์„œ ๊ธฐ์กด ํ† ํฐ์˜ ์œ ํšจ ์‹œ๊ฐ„์„ ์งง๊ฒŒ ๊ฐ€์ ธ๊ฐ€๊ณ  ์ƒˆ๋กœ์šด ํ† ํฐ์„ ์ง€์†ํ•ด์„œ ๋ฐœ๊ธ‰ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ์€ ํƒˆ์ทจ๋œ ํ† ํฐ์ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทผ๋ณธ์ ์ธ ํ•ด๊ฒฐ๋ฒ•์€ ์•„๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์€ํ–‰ ๊ฐ™์ด ๋ณด์•ˆ์— ๊ต‰์žฅํžˆ ๋ฏผ๊ฐํ•œ ๊ณณ์—์„œ๋Š” ์—ฌ๋Ÿฌ ์™ธ๋ถ€ ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•ด์„œ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•œ๋‹ค.