TIL 57: [์ธ์ฆ/๋ณด์•ˆ] ๊ธฐ์ดˆ - ํ† ํฐ(Token)

๋‹ค์Œ ์ฃผ์— ํฐ ์‹œํ—˜ ๋‘ ๊ฐœ๊ฐ€ ๊ฒน์น˜๊ณ  ์ด๋™์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๋‹ค๋ณด๋‹ˆ ๋ธ”๋กœ๊ทธ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ์ •์‹ ์ด ์—†๋„ค์š”๐Ÿฅฒ ์ตœ๋Œ€ํ•œ ๋ฐ€๋ฆฌ์ง€ ์•Š๊ณ  ์ •๋ฆฌํ•ด๋ณด๋ ค๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

 

์„ธ์…˜ ๊ธฐ๋ฐ˜ ์ธ์ฆ์€ ์„œ๋ฒ„ ํ˜น์€ DB์— ์œ ์ € ์ •๋ณด๋ฅผ ๋‹ด๋Š” ์ธ์ฆ ๋ฐฉ์‹์œผ๋กœ, ๋งค ์š”์ฒญ๋งˆ๋‹ค ์„œ๋ฒ„์—๋งŒ ๋ถ€๋‹ด์ด ๊ฐ€์ค‘๋˜๋Š” ์ธ์ฆ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๋ถ€๋‹ด์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์ด ๋‚˜์˜ค๊ฒŒ ๋˜์—ˆ๊ณ , ๊ทธ ์ค‘ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ์ธ์ฆ ๋ฐฉ์‹์€ JWT(JSON Web Token)์ž…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์— ์•”ํ˜ธํ™”ํ•œ ์œ ์ € ์ •๋ณด๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. 

JWT์˜ ์ข…๋ฅ˜

Access Token์€ ๋ณดํ˜ธ๋œ ์ •๋ณด๋“ค(์œ ์ €์˜ ์ด๋ฉ”์ผ, ์—ฐ๋ฝ์ฒ˜, ์‚ฌ์ง„ ๋“ฑ)์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ๋ถ€์—ฌ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฒ˜์Œ ์ธ์ฆ์„ ๋ฐ›๊ฒŒ ๋  ๋•Œ(๋กœ๊ทธ์ธ), access์™€ refresh token ๋‘๊ฐ€์ง€๋ฅผ ๋‹ค ๋ฐ›์ง€๋งŒ, access token์€ ์‹ค์ œ๋กœ ๊ถŒํ•œ์„ ์–ป๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ํ† ํฐ์œผ๋กœ ๋น„๊ต์  ์งง์€ ์œ ํšจ๊ธฐ๊ฐ„์„ ์ฃผ์–ด ํƒˆ์ทจ๋˜๋”๋ผ๋„ ์˜ค๋žซ๋™์•ˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. access token์˜ ์œ ํšจ๊ธฐ๊ฐ„์ด ๋งŒ๋ฃŒ๋œ๋‹ค๋ฉด refresh token์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด access token์„ ๋ฐœ๊ธ‰๋ฐ›์Œ์œผ๋กœ์„œ ์œ ์ €๋Š” ๋‹ค์‹œ ๋กœ๊ทธ์ธํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  refresh token ๋งˆ์ € ํƒˆ์ทจ๋‹นํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ ์ €์˜ ํŽธ์˜๋ณด๋‹ค ์ •๋ณด๋ฅผ ์ง€ํ‚ค๋Š” ๊ฒƒ์ด ๋” ์ค‘์š”ํ•œ ์›น์‚ฌ์ดํŠธ๋“ค์€ refresh token์„ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

JWT ๊ตฌ์กฐ

Header

Header๋Š” ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์•”ํ˜ธํ™”ํ•œ ์–ด๋–ค ์ข…๋ฅ˜์˜ ํ† ํฐ์ธ์ง€๊ฐ€ ์ ํ˜€ ์žˆ์Šต๋‹ˆ๋‹ค.

{ "alg": "HS256", "typ": "JWT" }

 

Payload

์ ‘๊ทผ ๊ถŒํ•œ, ์œ ์ € ์ด๋ฆ„ ๋“ฑ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„ ์•”ํ˜ธํ™”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•”ํ˜ธํ™”๊ฐ€ ๋˜๊ธด ํ–ˆ์ง€๋งŒ ๋˜๋„๋ก ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ๋‹ด์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

{ "sub": "someInformation", "name": "phillip", "iat": 171623391 }

 

Signature

์›ํ•˜๋Š” ๋น„๋ฐ€ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•”ํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ HMAC SHA256 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด signature๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

HMACSHA256(bawse64UrlEncode(header) + '.' + base64UrlEncode(payload), secret)

 

ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์ ˆ์ฐจ

ํด๋ผ์ด์–ธํŠธ์—์„œ ํ† ํฐ์ด ์ €์žฅ๋˜๋Š” ์œ„์น˜๋Š” local storage, cookie, react์˜ state ๋“ฑ ๋‹ค์–‘ํ•ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๊ฐ€ HTTP ํ—ค๋”(authorization ํ—ค๋”)์— ํ† ํฐ์„ ๋‹ด์•„๋ณด๋‚ผ ๋•Œ bearer authentication์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.

 

 

ํ† ํฐ๊ธฐ๋ฐ˜ ์ธ์ฆ์˜ ์žฅ์ 

Statelesness & Scalability (๋ฌด์ƒํƒœ์„ฑ & ํ™•์žฅ์„ฑ)

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

 

Safety (์•ˆ์ •์„ฑ)

์•”ํ˜ธํ™”ํ•œ ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๊ณ , ์•”ํ˜ธํ™” ํ‚ค๋ฅผ ๋…ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ์— ์ธ์ฆ์„ ์ €์žฅํ•ด๋„ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

 

Convenience (ํŽธ๋ฆฌ์„ฑ)

์–ด๋””์„œ๋‚˜ ํ† ํฐ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ† ํฐ ์ƒ์„ฑ์šฉ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ํšŒ์‚ฌ์—์„œ ํ† ํฐ ๊ด€๋ จ ์ž‘์—…์„ ๋งก๊ธฐ๋Š” ๋‹ค์–‘ํ•˜๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ payload๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์ •๋ณด์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ์ง€ ๊ถŒํ•œ์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.