Session vs JWT(JSON Web Token)

Bright Hyeonยท2022๋…„ 4์›” 23์ผ
0
post-thumbnail

๐ŸŽ ์ธ์ฆ(Authentication)๊ณผ ์ธ๊ฐ€(Authorization)

  • ์ธ์ฆ(Authentication): ๋ง ๊ทธ๋Œ€๋กœ ์ธ์ฆ == ๋กœ๊ทธ์ธ์ด๋‹ค. ์ „๋‹ฌ๋ฐ›์€ ID ๋ฐ Password์™€ ์ผ์น˜ํ•˜๋Š” ์œ ์ €์ •๋ณด๋ฅผ ์ฐพ๊ณ , ์ผ์น˜ํ•œ๋‹ค๋ฉด ์ธ์ฆ์ด ๋˜๋Š” ๊ฒƒ!!!
  • ์ธ๊ฐ€(Authorization): ๋กœ๊ทธ์ธ์„ ํ–ˆ์„ ๋•Œ, ๋ฐ›์•˜๋˜ SessionID or JWT๋ฅผ ์ด์šฉํ•ด์„œ ์š”์ฒญ์‹œ๋งˆ๋‹ค ์ด๋ฅผ ํ•จ๊ป˜ ์‹ค์–ด๋ณด๋‚ด๊ณ , ๋‚ด๊ฐ€ ๋กœ๊ทธ์ธ๋˜์–ด์žˆ๋Š” ์ƒํƒœ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๋ฆฌ๋Š” ๊ฒƒ. ์ฆ‰ == ๋กœ๊ทธ์ธ์„ ์œ ์ง€์‹œํ‚ค๋Š” ๊ฒƒ. ๊ถŒํ•œ์„ ์œ ์ง€์‹œ์ผœ์ฃผ๋Š” ๊ฒƒ์ž„.

๐Ÿ’ป Session vs Token

๐Ÿ Session๊ธฐ๋ฐ˜ Auth.

  • ์„ธ์…˜ ๊ธฐ๋ฐ˜์ธ์ฆ์€ ์„œ๋ฒ„(ํ˜น์€ DB)์— ์œ ์ € ์ •๋ณด๋ฅผ ๋‹ด๋Š” ์ธ์ฆ ๋ฐฉ์‹์ด๋‹ค.
  • ์„œ๋ฒ„์—์„œ๋Š” ์œ ์ €๊ฐ€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ์œ ์ €๋ฅผ ํ™•์ธํ•˜๊ธฐ์œ„ํ•ด ๋ฐ›์€ ์„ธ์…˜ ๊ฐ’์ด ์ž๊ธฐ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์„ธ์…˜ ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

  • SessionID๋Š” ์ฟ ํ‚ค์— ํ•จ๊ป˜ ์‹ค๋ ค ์œ ์ €์—๊ฒŒ ๋ณด๋‚ด์ง€๋Š” ๊ฑฐ๊ณ , ์œ ์ €๋Š” ์ฟ ํ‚ค์— SessionID๋ฅผ ์‹ค์–ด์„œ ์„œ๋ฒ„์—๋ณด๋‚ด๊ณ , ์„œ๋ฒ„๋Š” ๋ฐ›์€ SessionID์™€ ์ผ์น˜ํ•œ ๊ฐ’์„ ์„ธ์…˜์ €์žฅ์†Œ์—์„œ ์ฐพ๋Š” ๊ฒƒ์ž„.
  • Native App(iOS, Android)์—๋Š” ์ฟ ํ‚ค(Cookie)๊ฐ€ ์—†์Œ.(?)
  • ๋ณด์•ˆ์ ์œผ๋กœ๋Š” Token๋ณด๋‹ค Session์ด ์ข‹๋‹ค.
  • Token์€ ๊ทธ๋ƒฅ ํƒˆ์ทจํ•˜๊ณ  ๋””์ฝ”๋”ฉํ•˜๋ฉด ๊ทธ ์•ˆ์˜ ๋‚ด์šฉ์„ ๋ˆ„๊ตฌ๋‚˜ ๋ง˜๋จน์œผ๋ฉด ํ›”์ณ๋ณผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ!!!๋˜ํ•œ ๊ทธ Token์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๋‹ค๊ฐ€ Request๋ฅผ ์•…์šฉํ•  ์ˆ˜๋„ ์žˆ๊ณ !!!

โ€ผ๏ธ ๊ทธ๋ ‡๊ธฐ์— ์„œ๋น„์Šค๊ฐ€ ์ปค์ง€๊ณ , ์œ ์ € ์ •๋ณด๊ฐ€ ์ค‘์š”ํ•ด์ง์— ๋”ฐ๋ผ Token์—์„œ Session์œผ๋กœ ๊ฐˆ์•„ํƒˆ ์ค€๋น„ํ•ด์•ผํ•จ!

  • ์ผ๋‹จ์€ Token์ด ๋”ฐ๋กœ ์ธ๊ฐ€๋ฅผ ์œ„ํ•œ DB๊ฐ€ ๋”ฐ๋กœ ์—†์–ด๋„ ๋˜๊ธฐ์— ๋ถ€๋‹ด๋„ ์ ๊ณ , ๋˜๊ฒŒ ๊ฐ„ํŽธํ•˜๋‹ˆ ์ž‘์€ ์•ฑ์ด๋ผ๋ฉด Token์„ ์ถ”์ฒœํ•จ~!!!
  • ๋ฌผ๋ก , Refresh Token์„ ์ €์žฅํ•  ์ €์žฅ์†Œ๋Š” ์žˆ์–ด์•ผํ•˜์ง€๋งŒ, ์ด๋Š” Access Token์ด ๋งŒ๋ฃŒ๋˜์—ˆ์„ ์‹œ์—๋งŒ ํ›‘์–ด๋ณด๋ฉด ๋˜๊ธฐ๋•Œ๋ฌธ์— ๋ถ€๋‹ด์ด Session์— ๋น„ํ•ด์ ๋‹ค.
  • ์ฐธ๊ณ  URL: https://velog.io/@junghyeonsu/ํ”„๋ก ํŠธ์—์„œ-๋กœ๊ทธ์ธ์„-์ฒ˜๋ฆฌํ•˜๋Š”-๋ฐฉ๋ฒ•

๐Ÿฅต Session๊ธฐ๋ฐ˜ Auth์˜ ๋‹จ์ 

  • ๋งค ์š”์ฒญ๋งˆ๋‹ค ์„ธ์…˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด ๋ถˆํŽธํ•จ.
  • ์„ธ์…˜์€ ์„œ๋ฒ„๋‹น ํ•˜๋‚˜๋งŒ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ผ ์ƒํ™ฉ์ด ์žˆ๋‹ค๋ฉด ๋˜ ๊ทธ์— ๋งž๋Š” ์„ธ์…˜ ๊ฐ’์„ ๋งŒ๋“ค์–ด์•ผํ•˜๋Š” ๋ณต์žก์„ฑ์ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ถ„์‚ฐ์‹œ์Šคํ…œ(์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ผ ๋•Œ)์ผ ๋•Œ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ต๋‹ค.

๐Ÿ Token๊ธฐ๋ฐ˜ Auth

  • ๋Œ€ํ‘œ์ ์œผ๋กœ JWT(JSON Web Token)์ด ์žˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ์—์„œ ์ธ์ฆ ์ •๋ณด๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๋ฐฉ๋ฒ•.
  • ํ† ํฐ์€ ์œ ์ € ์ •๋ณด๋ฅผ ๊ทธ ์ž์ฒด์— ๋‹ด์„ ์ˆ˜ ์žˆ๊ณ , ํด๋ผ์ด์–ธํŠธ ์ƒ์—์„œ ๋กœ์ปฌ ์ €์žฅ์†Œ์— ๋˜ ํ•œ๋ฒˆ ๋” ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด๊ด€ํ•  ์ˆ˜ ์žˆ๋‹ค. (์•”ํ˜ธํ™”์•ˆ๋˜์žˆ๋‹ค๋ฉด XSS, CSRF๊ณต๊ฒฉ์— ๋…ธ์ถœ ์œ„ํ—˜์žˆ์Œ.)
  • ํ† ํฐ ๋น„์œ )
    - ์˜ค๋ฝ์‹ค ๊ฒŒ์ž„์— ์‚ฌ์šฉํ•˜๋Š” ํ† ํฐ.
    - ํ–‰์‚ฌ์— ์ž…์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ์ตœ ์ธก์—์„œ ๋‚˜๋ˆ„์–ด ์ค€ ํ† ํฐ
    - ๋†€์ด๊ณต์›์— ์ž…์žฅ๋ฃŒ๋ฅผ ๋‚ด๋ฉด ์ฃผ๋Š” ํ† ํฐ.

๐Ÿงƒ JWT

๐ŸŠ ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์œ ์šฉํ•œ๊ฐ€.

  1. ํšŒ์› ์ธ์ฆ: JWT๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ํ”ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค. ํ† ํฐ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งค ์š”์ฒญ ์‹œ ๋งˆ๋‹ค JWT๋ฅผ ํ—ค๋”์— ํฌํ•จํ•˜์—ฌ ์ „๋‹ฌํ•จ. ์š”์ฒญ์ด ์˜ค๋ฉด ์„œ๋ฒ„๋Š” ํ•ด๋‹น ํ† ํฐ์ด ์œ ํšจํ•˜๊ณ  ์ธ์ฆ๋๋Š”์ง€ ๊ฒ€์ฆํ•˜๊ณ , ์œ ์ €๊ฐ€ ์š”์ฒญํ•œ ์ž‘์—…์— ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์—ฌ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    ์„œ๋ฒ„์ธก์—์„  ์œ ์ €์˜ ์„ธ์…˜์„ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰ ์œ ์ €๊ฐ€ ๋กœ๊ทธ์ธ๋˜์–ด์žˆ๋Š”์ง€ ์•ˆ๋˜์–ด์žˆ๋Š”์ง€ ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†๊ณ , ์œ ์ €๊ฐ€ ์š”์ฒญํ–ˆ์„ ๋•Œ ํ† ํฐ๋งŒ ํ™•์ธํ•˜๋ฉด๋˜๋‹ˆ, ์„ธ์…˜๊ด€๋ฆฌ๊ฐ€ ํ•„์š”์—†์–ด์„œ ์„œ๋ฒ„ ์ž์›์„ ๋งŽ์ด ์•„๋‚„ ์ˆ˜ ์žˆ์ฃ . ๋กœ๊ทธ์•„์›ƒ๋˜๋ฉด ํ† ํฐ์ด ์—†๋Š” ์ƒํ™ฉ์ผ ํ…Œ๋‹ˆ ๊ฑฐ์ ˆ๋„ฃ์–ด์ฃผ๋ฉด๋˜๊ณต.
  2. ์ •๋ณด๊ต๋ฅ˜: JWT๋Š” ๋‘ ๊ฐœ์ฒด ์‚ฌ์ด์—์„œ ์•ˆ์ •์„ฑ์žˆ๊ฒŒ ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•˜๊ธฐ ์ข‹์€ ๋ฐฉ๋ฒ•. ์ •๋ณด๊ฐ€ sign์ด ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ณด๋ฅผ ๋ณด๋‚ธ์ด๊ฐ€ ๋ฐ”๋€Œ์ง„ ์•Š์•˜๋Š”์ง€, ๋˜ ์ •๋ณด๊ฐ€ ๋„์ค‘์— ์กฐ์ž‘๋˜์ง€๋Š” ์•Š์•˜๋Š”์ง€ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ€ผ๏ธ ์ •๋ณด์กฐ์ž‘์€ ๋ชปํ•˜์ง€๋งŒ, ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ํƒˆ์ทจํ•ด์„œ ์•…์šฉ์€ ๊ฐ€๋Šฅ... ํ‘

Access Token & Refresh Token

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

Q. ๊ทธ๋Ÿฌ๋ฉด access Token๋งŒ ์žˆ์œผ๋ฉด ๋˜๋Š” ๊ฒƒ ์•„๋‹Œ๊ฐ€์š”?

  • ๋งŒ์ผ access token์„ ํƒˆ์ทจ๋‹นํ•œ๋‹ค๋ฉด? ์ด ์•…์˜์ ์ธ ์œ ์ €๋Š” ์ž๊ธฐ๊ฐ€ ๊ทธ ์œ ์ €์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์„œ๋ฒ„์— ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ณ , ๋ˆ ๊ด€๋ จ์ด๋ผ๋ฉด ๋” ํฐ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— access Token์€ ๋น„๊ต์  ์งง์€ ์œ ํšจ๊ธฐ๊ฐ„์„ ๊ฐ€์ง„๋‹ค. ํƒˆ์ทจํ•˜๋”๋ผ๋„ ์˜ค๋ž˜ ์‚ฌ์šฉ๋ชปํ•˜๋„๋ก! ๋งŒ๋ฃŒ๋œ๋‹ค๋ฉด refresh token์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด access Token์„ ๋ฐœ๊ธ‰๋ฐ›๋Š”๋‹ค.

JWT ๊ตฌ์กฐ

aaaaaa.bbbbbb.cccccc
a - header, b - ๋‚ด์šฉ(payload), c - ์„œ๋ช…(signature)

๐Ÿ‘ค Header

  • header๋Š” 1) ์ด๊ฒƒ์ด ์–ด๋–ค ์ข…๋ฅ˜์˜ ํ† ํฐ์ธ์ง€(์ง€๊ธˆ์˜ ๊ฒฝ์šฐ์—” JWT), 2) ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ sign(์•”ํ˜ธํ™”)ํ• ์ง€๊ฐ€ ์ ํ˜€์žˆ๋‹ค. JSON Web Token์ด๋ž€ ์ด๋ฆ„์— ๊ฑธ๋งž๊ฒŒ JSONํ˜•ํƒœ๋กœ ์ด๋Ÿฐ ํ˜•ํƒœ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
{
	"alg": "HS256", //ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ง€์ •; ํ•ด์‹ฑ - ์›๋ณธ์„ ์•Œ์•„๋ณผ ์ˆ˜ ์—†๋Š” ๋‚œํ•ดํ•œ ๋ฌธ์ž์—ด๋กœ ์ •์˜ํ•˜๋Š” ๊ณผ์ •. ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋ก  ๋ณดํ†ต HMAC SHA256 ํ˜น์€ RSA๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    "typ": "JWT" //ํ† ํฐ์˜ ํƒ€์ž…์„ ์ง€์ •.
}
  • ์ด JSON๊ฐ์ฒด๋ฅผ base64๋ฐฉ์‹์œผ๋กœ ์ธ์ฝ”๋”ฉํ•˜๋ฉด JWT์˜ ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์ด ์™„์„ฑ๋œ๋‹ค.

๐Ÿ’ช๐Ÿป Payload

  • ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋Š” ํŒŒํŠธ์ด๋‹ค.
  • ์—ฌ๊ธฐ์— ๋‹ด๋Š” ์ •๋ณด์˜ ํ•œ '์กฐ๊ฐ'์„ ํด๋ ˆ์ž„(claim)์ด๋ผ ๋ถ€๋ฅด๊ณ , ์ด๋Š” name/value ํ•œ ์Œ์œผ๋กœ ์ด๋ค„์ ธ์žˆ์Šต๋‹ˆ๋‹ค. ํ† ํฐ์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํด๋ ˆ์ž„๋“ค์„ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์–ด๋–ค ์ •๋ณด์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ์ง€์— ๋Œ€ํ•œ "๊ถŒํ•œ"์„ ๋‹ด์„ ์ˆ˜๋„ ์žˆ๊ณ , "์‚ฌ์šฉ์ž์˜ ์œ ์ € ์ด๋ฆ„ ๋“ฑ" ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋Š” ์ด๊ณณ์— ๋‹ด์•„ ์•”ํ˜ธํ™”์‹œํ‚จ๋‹ค.
{
	"sub": "someInformation",
    "name": "Tamna",
    "iat": 151623391
}
  • header์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์œ„ JSON๊ฐ์ฒด๋ฅผ base64๋กœ ์ธ์ฝ”๋”ฉํ•˜๋ฉด JWT์˜ ๋‘ ๋ฒˆ์งธ ๋ธ”๋ก์ด ์™„์„ฑ๋œ๋‹ค.
  • claim์—๋Š” ํฌ๊ฒŒ ์„ธ ๋ถ„๋ฅ˜๊ฐ€ ์žˆ๋Š”๋ฐ ์ด ์—ญ์‹œ ์ฐธ๊ณ ํ•ด๋ณด์„ธ์šฉ. (์•„๋ž˜ ๋งํฌ!)
  • ์ฐธ๊ณ  URL: https://velopert.com/2389
  • header๋‚˜ payload๋‚˜ ๋‘˜ ๋‹ค JSONํ˜•ํƒœ์˜ ๊ฐ์ฒด๊ฐ€ base64๋กœ ์ธ์ฝ”๋”ฉ๋˜๋Š” ๊ณผ์ •์—์„œ ๊ณต๋ฐฑ/์—”ํ„ฐ๋“ค์ด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค

1) JSON์ƒํƒœ
{
"typ": "JWT",
"alg": "HS256"
}

2) ๊ณต๋ฐฑ/์—”ํ„ฐ ์‚ฌ๋ผ์ง.
{"alg":"HS256","typ":"JWT"}

3) ์ธ์ฝ”๋”ฉ ์™„๋ฃŒ.
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

  • payLoad์˜ ๊ฒฝ์šฐ ๋‚ด์šฉ์ด ๋งŽ์„์ˆ˜๋ก, ํ† ํฐ ๊ต‰์žฅํžˆ ๊ธธ์–ด์ง„๋‹ค.

โ€ผ๏ธ Payload์˜ claim๋“ค์„ ๋งŒ๋“ค ๋•Œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ ์€! ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ๋„ฃ์–ด์„  ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. header๋‚˜ payload๋Š” ๋‹จ์ˆœํžˆ base64๋กœ ์ธ์ฝ”๋”ฉํ•œ ๊ฒƒ์ด๊ธฐ์— ํƒˆ์ทจํ•˜์—ฌ ๋””์ฝ”๋”ฉํ•˜๋ฉด ๋‚ด๋ถ€ ๋‚ด์šฉ์„ ์‰ฝ๊ฒŒ ๋‹ค๋ฅธ ์ œ3์ž๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ~! ๊ทธ๋Ÿฌ๋‹ˆ, ์ธ๊ฐ€(Authorization)์— ํ•„์š”ํ•œ ์ •๋ณด๋“ค๋งŒ ๋‹ด๋Š”๋‹ค. โ€ผ๏ธ

๐Ÿ’ฑ Signature

  • base64๋กœ ์ธ์ฝ”๋”ฉ๋œ header, payload๊ฐ€ ์™„์„ฑ๋˜์—ˆ๋‹ค๋ฉด, ์›ํ•˜๋Š” ๋น„๋ฐ€ ํ‚ค(์•”ํ˜ธํ™”์— ์ถ”๊ฐ€ํ•  salt)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•”ํ˜ธํ™”ํ•œ๋‹ค. base64 ์ธ์ฝ”๋”ฉ์„ ํ•œ ๊ฐ’์€ ๋ˆ„๊ตฌ๋‚˜ ์‰ฝ๊ฒŒ ๋””์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋น„๋ฐ€ํ‚ค๋ฅผ ํƒˆ์ทจํ•œ ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด ์ด SignatureํŒŒํŠธ๋Š” ํ•ด๋…ํ•ด๋‚ด๋Š”๋ฐ ์—„์ฒญ๋‚œ ์‹œ๊ฐ„๊ณผ ๋…ธ๋ ฅ์ด ๋“ค์–ด๊ฐˆ ๊ฒƒ์ด๋‹ค.
  • ์ด ์„œ๋ช…์€ header์˜ ์ธ์ฝ”๋”ฉ๊ฐ’๊ณผ, payload์˜ ์ธ์ฝ”๋”ฉ๊ฐ’์„ ํ•ฉ์นœ ํ›„ ์ฃผ์–ด์ง„ ๋น„๋ฐ€ํ‚ค๋กœ ํ•ด์‹ฑ์„ ํ•˜์—ฌ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
HMACSHA256( //header์—์„œ ์ง€์ •ํ–ˆ๋˜ algorithm๋ฐฉ์‹์œผ๋กœ!
	base64UrlEncode(header) + "." +  
    base64UrlEncode(payload), //base64 ์ธ์ฝ”๋”ฉํ•œ ํ—ค๋”, ๋‚ด์šฉ์„ ๋ฌถ์€๋‹ค์Œ,
    secret) //์ฃผ์–ด์ง„ ๋น„๋ฐ€ํ‚ค๋กœ ํ•ด์‹ฑ์‹คํ–‰!
  • ๋งˆ์ง€๋ง‰์œผ๋กœ ์ด๋ ‡๊ฒŒ ๋งŒ๋“  ํ•ด์‰ฌ(hexํƒ€์ž…)๊ฐ’์„ ๋‹ค์‹œ hex -> base64๋กœ ์ธ์ฝ”๋”ฉํ•˜๋ฉด ๋งˆ๋ฌด๋ฆฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • ํ—ค๋”์™€ payload๋ฅผ ์ธ์ฝ”๋”ฉํ•˜๊ณ  ํ•ฉ์น˜๊ธฐ๋งŒ ํ–ˆ์„ ๋•Œ๋Š” ๊ต‰์žฅํžˆ ๊ธด ๋ฌธ์ž์—ด๋กœ ๋‚˜์—ด๋˜์–ด์žˆ๋Š”๋ฐ, ์ด๋ฅผ ๋น„๋ฐ€ํ‚ค๋กœ ํ•ด์‹ฑํ•˜๊ณ  ๋‹ค์‹œ ์ธ์ฝ”๋”ฉํ•˜๋ฉด ๋”ฑ ์ ๋‹นํ•œ ๊ธธ์ด์˜ signํŒŒํŠธ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

1) ํ•ด์‹ฑ ์ „. (header + "." + body)
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ2ZWxvcGVydC5jb20iLCJleHAiOiIxNDg1MjcwMDAwMDAwIiwiaHR0cHM6Ly92ZWxvcGVydC5jb20vand0X2NsYWltcy9pc19hZG1pbiI6dHJ1ZSwidXNlcklkIjoiMTEwMjgzNzM3MjcxMDIiLCJ1c2VybmFtZSI6InZlbG9wZXJ0In0

2) ํ•ด์‹ฑํ•˜๊ณ  ๋‹ค์‹œ ์ธ์ฝ”๋”ฉํ•˜๋ฉด,
WE5fMufM0NDSVGJ8cAolXGkyB5RmYwCto1pQwDIqo2w
๊นฐ๊ปŒ!

  • ๋ฌผ๋ก  ์œ„์—์„œ ๋งŒ๋“  3ํŒŒํŠธ๋ฅผ .์„ ํ†ตํ•ด ์—ฐ๊ฒฐํ•˜๊ณ  ๋‹คํ•ฉ์น˜๋ฉด JWT๋Š” ๊ต‰์žฅํžˆ ๊น๋‹ˆ๋‹ค. ใ…‹ใ…‹

๐ŸŠ Token ์ƒ์„ฑ ์š”์•ฝ.

  • ์ฆ‰! ์š”์•ฝํ•˜์ž๋ฉด, ๋””์ฝ”๋”ฉ๋œ์ƒํƒœ์—์„œ์˜ Token์€ JSONํ˜•ํƒœ์ด๋‹ค
  • ์ด๋ฅผ ์œ„์—์„œ ์ญ‰ ์„ค๋ช…ํ–ˆ๋˜ ๋ฐฉ์‹๋Œ€๋กœ ์ธ์ฝ”๋”ฉ์„ ํ•˜๊ฒŒ๋˜๊ณ , ํŠนํžˆ SignatureํŒŒํŠธ๋Š” ๋น„๋ฐ€ํ‚ค์™€ ํ•จ๊ป˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์•”ํ˜ธํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํƒˆ์ทจ๋˜์–ด๋„ ํƒˆ์ทจ์ž๊ฐ€ ํ•ด๋…ํ•˜๊ธฐ ํž˜๋“ญ๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„์—์„œ ์ธ์ฝ”๋”ฉํ•œ ์ƒํƒœ๋กœ User(Client)์— ์ „๋‹ฌํ•ด์ฃผ๋ฉด, Client๋Š” ๊ตณ์ด ์ด๊ฑธ ๋””์ฝ”๋”ฉ์œผ๋กœ ์—ด์–ด๋ณผ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์š”์ฒญ ์‹œ ๊ทธ๋ƒฅ ๋ฐ›์•˜๋˜ ํ˜•ํƒœ ๊ทธ๋Œ€๋กœ Header์— ์‹ค์–ด๋ณด๋‚ด๊ธฐ๋งŒ ํ•˜๋ฉด๋˜๋‹ˆ๊น์šฉ~!!
  • ๊ทธ๋ฆฌ๊ณ  AccessToken์˜ ์œ ํšจ๊ธฐ๊ฐ„์„ ์งง๊ฒŒ ์ฃผ๋ฉด, ์œ ์ถœ๋˜๋„ ๊ทธ๋‚˜๋งˆ ์•ˆ์ „!!

JWTํ…Œ์ŠคํŠธ์šฉ ์‚ฌ์ดํŠธ!!! URL: https://jwt.io

๐Ÿ˜Ž ํ•ต์ค‘์š” ์ด์•ผ๊ธฐ

  • ์•ž์—์„œ ๋ณด์•˜๋“ฏ์ด Header์™€ Payload Claim Set์€ ์•”ํ˜ธํ™”๋ฅผ ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹จ์ˆœํžˆ JSON๋ฌธ์ž์—ด์„ base64๋กœ ์ธ์ฝ”๋”ฉํ•œ ๊ฒƒ๋ฟ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋ˆ„๊ตฌ๋‚˜ ์ด ๊ฐ’์„ ๋‹ค์‹œ ๋””์ฝ”๋”ฉํ•˜๋ฉด JSON์— ์–ด๋–ค ๋‚ด์šฉ์ด ๋“ค์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ํ† ํฐ์„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์œ„๋ณ€์กฐํ•  ์ˆ˜ ์—†์–ด์•ผ ํ•˜๋ฏ€๋กœ ํ—ค๋”์™€ Claim Set๊ฐ€ ์œ„๋ณ€์กฐ๋˜์—ˆ๋Š”์ง€๋ฅผ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•œ ๋ถ€๋ถ„์ด Signature ๋ถ€๋ถ„์ด๋‹ค. Sign๋ถ€๋ถ„์ž์ฒด๊ฐ€ header์™€ payload๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด๊ธฐ์—, ๋ณ€์กฐ๋˜๋ฉด ์ผ์น˜ํ•˜์ง€์•Š์Œ์„ ํ™•์ธํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.
  • โ€ผ๏ธ ์„œ๋ช…๋„ ๊ฐ™์ด ์œ„๋ณ€์กฐํ•ด๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ์œ„ํ•ด, ๋น„๋ฐ€ํ‚ค(Secret Key)๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด๊ณ , ์ด ๋น„๋ฐ€ํ‚ค๋Š” ๋‹น์—ฐํ•˜๊ฒŒ๋„ ์™ธ๋ถ€์— ๋…ธ์ถœ๋˜๋ฉด ์•ˆ๋œ๋‹ค.

SignatureํŒŒํŠธ ํ•ด๋…์„ "๋น„๋ฐ€ํ‚ค ์—†์ด" ํ•  ์ˆ˜ ์—†๋Š” ์ด์œ 

  • Server๋Š” JWT์˜ SignatureํŒŒํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ, Secret Key๋ฅผ ๋„ฃ์–ด ์ฃผ์–ด์ง„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ํ•ด์‹ฑํ•œ๋‹ค๊ณ  ๋ง์”€๋“œ๋ ธ๋Š”๋ฐ์š”.
  • Header๋ฅผ ์ธ์ฝ”๋”ฉํ•ด์„œ ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ•ด์‹ฑ๋œ ๊ฒƒ์ธ์ง€ ์ œ3์ž๊ฐ€ ์•Œ์•„๋ƒˆ๋‹ค๊ณ ํ•ด๋„, ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ•ด๋…ํ•˜๋ ค๋ฉด "๋น„๋ฐ€ํ‚ค"๋ฅผ ๋„ฃ๊ณ โ€ผ๏ธ ํ•ด๋…์„ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ ‡๊ธฐ์— ๋‹น์—ฐํžˆ ๋น„๋ฐ€ํ‚ค๋ฅผ ๋ชจ๋ฅธ๋‹ค๋ฉด ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ์ง€ ์•ˆ๋‹ค๊ณ ํ•ด๋„, ์ด SignatureํŒŒํŠธ๋ฅผ ์—ด์–ด๋ณผ ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด์ฃ !!!
  • ์—ด์–ด๋ณผ ์ˆ˜ ์—†์œผ๋‹ˆ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ SignatureํŒŒํŠธ๋Š” ์กฐ์ž‘์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์„œ, ์ฒ˜์Œ Server๋ฅผ ํ†ตํ•ด ๋ฐ›์•˜๋˜ ๋ฌธ์ž์—ด ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

์œ„๋ณ€์กฐ๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•

  • Server๋Š” Client์—๊ฒŒ์„œ Token์„ ๋ฐ›์œผ๋ฉด, ๋ฐ›์€ Header, Payload๋ถ€๋ถ„์„ ์ž์‹ ๋งŒ์ด ์†Œ์œ ํ•œ Secret Key๋ฅผ ์ด์šฉํ•ด ์ƒˆ๋กญ๊ฒŒ SignatureํŒŒํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ ํ›„์— ์š”์ฒญ ์‹œ ์ „๋‹ฌ๋ฐ›์•˜๋˜ SignatureํŒŒํŠธ์™€ ๋ฐฉ๊ธˆ ์ž์‹ ์ด ์ƒ์„ฑํ•œ Signature๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ด ๊ฐ’์ด ๋ถˆ์ผ์น˜ํ•˜๋‹ค๋ฉด, ๊ทธ๊ฒƒ์€ Header ํ˜น์€ Payload ์ค‘ ์ผ๋ถ€๊ฐ€ ์œ„๋ณ€์กฐ๋˜์—ˆ๋‹ค๋ผ๋Š” ๊ฒƒ์ด์ฃ . ์ด๋Ÿด ๊ฒฝ์šฐ Server๋Š” Client์— ๋Œ€ํ•œ ์ธ๊ฐ€(Authorization)๋ฅผ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.โ€ผ๏ธ

JWT ์‚ฌ์šฉ ์˜ˆ์‹œ

  • JWT๋Š” ๊ถŒํ•œ ๋ถ€์—ฌ์— ๊ต‰์žฅํžˆ ์œ ์šฉ.
  • ์ƒˆ๋กœ ๋‹ค์šด๋ฐ›์€ A๋ž€ ์•ฑ์ด Gmail๊ณผ ์—ฐ๋™๋˜์–ด ์ด๋ฉ”์ผ์„ ์ฝ์–ด์™€์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์„ ๋•Œ, ์œ ์ €๋Š”
  1. Gmail ์ธ์ฆ์„œ๋ฒ„์— ๋กœ๊ทธ์ธ์ •๋ณด(์•„์ด๋””, ๋น„๋ฐ€๋ฒˆํ˜ธ)๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  2. ์„ฑ๊ณต์ ์œผ๋กœ ์ธ์ฆ ์‹œ JWT๋ฅผ ๋ฐœ๊ธ‰๋ฐ›๋Š”๋‹ค.
  3. A์•ฑ์€ JWT๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด๋‹น ์œ ์ €์˜ Gmail์ด๋ฉ”์ผ์„ ์ฝ๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • JWT๊ฐ€ ๋‹ค๋ฅธ ํ† ํฐํ•˜๊ณ  ๊ฐ€์žฅ ๋‹ค๋ฅธ ๋ถ€๋ถ„์€ ํ† ํฐ ์ž์ฒด๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.

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

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

  • ์—ญ์‹œ URL: https://velog.io/@usreon/ํ† ํฐ-๊ธฐ๋ฐ˜-์ธ์ฆ-Token-based-Authentication
    ์ฐธ๊ณ !!!
  • ์„ธ์…˜์€ ์œ ์ €๋ฅผ ์ธ์ฆํ•˜๊ธฐ ์œ„ํ•ด, ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์„ธ์…˜๊ฐ’์œผ๋กœ ์ €์žฅํ•˜๊ณ , ์ •๋ณด๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€๋ฅผ ์„œ๋ฒ„๋ฅผ ๋’ค์ ธ ์ฐพ์•„์„œ์ค˜์•ผํ•˜์ง€๋งŒ, ํ† ํฐ์€ ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์—†๊ณ , ํ† ํฐ ํ•ด๋…์ด ๋˜๋Š”์ง€๋งŒ ํŒ๋‹จํ•˜๊ณ , ํŒ๋‹จ์ด ๋˜๋ฉด ๋ฐ”๋กœ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๊ธฐ๋งŒํ•˜๊ณ , ์‘๋‹ต์„ ์ฃผ๋ฉด๋œ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ HTTP ํ—ค๋”(authorization ํ—ค๋”)์— ํ† ํฐ์„ ๋‹ด์•„ ๋ณด๋‚ธ๋‹ค.
  • ์„œ๋ฒ„์—์„œ ๋””์ฝ”๋”ฉํ•ด์„œ ์ฝ๊ณ  ํ™•์ธ. ํด๋ผ์ด์–ธํŠธ๋Š” ๊ตณ์ด ํ† ํฐ์„ ๋”ฐ๋กœ ์ธ์ฝ”๋”ฉํ•ด์„œ ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์—†์Œ.

๐ŸŽ JWT ์ถ”๊ฐ€์„ค๋ช…(์ค‘์š” ๋‚ด์šฉ์ด๋ผ ํ•œ๋ฒˆ ๋”!).

  • JWT์˜ ๊ฒฝ์šฐ๋Š” ํ† ํฐ์„ ๋ฐ›์•„์„œ ์„œ๋ช…์œผ๋กœ ์œ ํšจํ•œ ํ† ํฐ์ธ์ง€ ๊ฒ€์ฆ์„ ํ•œ ๋’ค์— ์œ ํšจํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜๋ฉด ํด๋ ˆ์ž„์…‹์„ ๋””์ฝ”๋”ฉํ•ด์„œ ํ† ํฐ์— ๋‹ด๊ธด ๋ฐ์ดํ„ฐ๋ฅผ ์—ด์–ด๋ณธ๋‹ค. ์•ž์—์„œ ๋ณด์•˜๋“ฏ์ด ํด๋ ˆ์ž„์…‹์˜ JSON์— ๋งŒ๋ฃŒ์‹œ๊ฐ„ ๋“ฑ์ด ๋‹ด๊ฒจ์žˆ์œผ๋ฏ€๋กœ ํ† ํฐ์ด ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ์ง€ ๊ฒ€์‚ฌ๋ฅผ ํ•˜๊ณ  ์ด์ƒ์ด ์—†์œผ๋ฉด ๋ฐ”๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ํ† ํฐ์˜ ์‚ฌ์šฉ์ž ์•„์ด๋”” ๋“ฑ์ด ํด๋ ˆ์ž„์…‹์— ๋‹ด๊ฒจ์žˆ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ์บ์‹œ๋ฅผ ์กฐํšŒํ•  ํ•„์š”์—†์ด ๋ฐ”๋กœ ์• ํ”Œ๋ ˆ์ด์ผ€์…˜์ด์„œ ์‚ฌ์šฉ์ž๋ฅผ ํ™•์ธํ•˜๊ณ  ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋Œ€์‹  ๋‹ค๋ฅธ ํ† ํฐ๋ณด๋‹ค ๊ธธ์ด๊ฐ€ ์ข€ ๊ธธ๋‹ค๋Š” ๋ฌธ์ œ๋Š” ์žˆ๋‹ค.
    https://blog.outsider.ne.kr/1160

  • ์•ž์—์„œ ๋ณด์•˜๋“ฏ์ด ํด๋ ˆ์ž„์…‹์€ ์•”ํ˜ธํ™”ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ์„œ๋ช… ์—†์ด๋„ ๋ˆ„๊ตฌ๋‚˜ ์—ด์–ด๋ณผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์—๋Š” ๋ณด์•ˆ์ด ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋Š” ๋„ฃ์œผ๋ฉด ์•ˆ ๋œ๋‹ค. base64๋กœ ์ธ์ฝ”๋”ฉํ•ด์„œ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ์ด ๋ถ€๋ถ„์„ ๊ฐ„๊ณผํ•˜๊ธฐ ์‰ฌ์šด๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์ •๋ณด๋งŒ ํด๋ ˆ์ž„์…‹์— ๋‹ด์•„์•ผ ํ•œ๋‹ค.

  • ๋”ฐ๋ผ์„œ, User์˜ ์ด๋ฆ„์ด๋‚˜ ์ด๋ฉ”์ผ๊นŒ์ง„ ๋“ค์–ด๊ฐ€๋”๋ผ๋„, ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด ์•ˆ๋ ๋“ฏ!!!!

  • ์œ ์ €๋Š” ๋‹จ์ˆœํžˆ ์„œ๋ฒ„๊ฐ€ ์ฃผ๋Š” ๋‚ด์šฉ์„ ๋””์ฝ”๋”ฉํ•ด์„œ header์™€ payload๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์„ ๋ฟ ์ˆ˜์ •์„ ํ•ด์„  ์•ˆ๋œ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ๋‚ด์šฉ์„ ๋ณ€์กฐํ•œ๋‹ค๋ฉด ์„œ๋ฒ„๋Š” ์•Œ์•„๋‚ผ ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ํƒˆ์ทจ๋˜์–ด๋„ signature์€ ๊ณ ์œ ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜, ๋น„๋ฐ€ํ‚ค์œผ๋กœ ์•”ํ˜ธํ™”๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฑด๋“œ๋ฆด ์ˆ˜๊ฐ€ ์—†๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ header์™€ payload๋ฅผ ๊ฑด๋“œ๋ ค๋„ ์„œ๋ฒ„๋Š” ์ด๊ฒŒ ๋ณ€์กฐ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์ˆ˜์žˆ๋‹ค.

ex)

๋ณ€์กฐ ์ „)

๋ˆ„๊ตฐ๊ฐ€ payload๋‚ด์šฉ์„ ๋ณ€๊ฒฝ)

  • But, ์•”ํ˜ธํ™”๋œ Sign์€ ๊ฑด๋“œ๋ฆด ์ˆ˜ ์—†๊ธฐ์— Sign๋ฌธ์ž์—ด์€ ๊ทธ๋Œ€๋กœ์ธ ์ƒํƒœ!

Server๋Š” ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์œ„ํ•ด ๋ฐ›์€ Header, Payload๋กœ๋ถ€ํ„ฐ ๋‹ค์‹œ ์šฐ๋ฆฌ ๋น„๋ฐ€ํ‚ค, ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜์—ฌ Sign์„ ์ƒ์„ฑํ•ด๋ด„.

  • SignatureํŒŒํŠธ์˜ ๋ถˆ์ผ์น˜๋ฅผ ํ™•์ธ -> invalid Signature๋ผ ํŒ๋‹จ -> ์ธ์ฆ ์‹คํŒจ!
profile
i'm Obsessed with Swift. iOS

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