Home > CS > 2024 > ๐Ÿ’พ [CS] JWT(JSON Web Token) ํ† ํฐ์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

๐Ÿ’พ [CS] JWT(JSON Web Token) ํ† ํฐ์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?
CS

๐Ÿ’พ [CS] JWT(JSON Web Token) ํ† ํฐ์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

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

1๏ธโƒฃ JWT์˜ ๊ตฌ์กฐ.

  • JWT(JSON Web Token)๋Š” ์„ธ ๊ฐ€์ง€ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.
      1. ํ—ค๋”(Header)
      1. ํŽ˜์ด๋กœ๋“œ(Payload)
      1. ์„œ๋ช…(Signature)

1๏ธโƒฃ ํ—ค๋”(Header)

  • ํ† ํฐ์˜ ํƒ€์ž…(JWT-JSON Web Token)๊ณผ ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋ณด(์˜ˆ: HMAC, SHA256)๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ: {"alg": "HS256", "typ": "JWT"}

๐Ÿค” JWT์˜ ํ—ค๋”์—์„œ ํ† ๊ทผ์˜ ํƒ€์ž…์„ ํฌํ•จํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ?

JWT(JSON Web Token)์˜ ํ—ค๋”(Header)์— ํ† ํฐ์˜ ํƒ€์ž…์„ ํฌํ•จํ•˜๋Š” ์ด์œ ๋Š” ์ˆ˜์‹ ์ž๊ฐ€ ํ† ํฐ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ธ์‹ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ž…๋‹ˆ๋‹ค.

๐Ÿค” ํ† ํฐ์˜ ํƒ€์ž…(Token Type)์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ?

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

๐Ÿค” JWT์˜ ํ—ค๋”์—์„œ ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ?

JWT(JSON Web Token)์˜ ํ—ค๋”(Header)์— ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋Š” ์ด์œ ๋Š” ํ† ํฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋ฌด์—‡์ธ์ง€ ์ˆ˜์‹  ์ธก์—์„œ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค.

๐Ÿค” ํ•ด์‹œ๊ฐ’(Hash Value), ๋˜๋Š” ํ•ด์‹œ ์ฝ”๋“œ(Hash Code)๋Š” ๋ฌด์—‡์ผ๊นŒ?

ํ•ด์‹œ๊ฐ’(Hash Value), ๋˜๋Š” ํ•ด์‹œ ์ฝ”๋“œ(Hash Code)๋Š” ์ž„์˜์˜ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ์ •๋œ ๊ธธ์ด์˜ ๋ฌธ์ž์—ด์ด๋‚˜ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค.
ํ•ด์‹œ๊ฐ’(Hash Value)์€ ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋ฉฐ, ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ™์œผ๋ฉด ํ•ญ์ƒ ๊ฐ™์€ ํ•ด์‹œ๊ฐ’(Hash Value)์„ ์ƒ์„ฑํ•˜์ง€๋งŒ, ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฉด ์™„์ „ํžˆ ๋‹ค๋ฅธ ํ•ด์‹œ๊ฐ’(Hash Value)์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๐Ÿค” ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Hashing Algorithm)์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ?

์ž„์˜์˜ ๊ธธ์ด๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ์ •๋œ ๊ธธ์ด์˜ ํ•ด์‹œ๊ฐ’(Hash Value), ๋˜๋Š” ํ•ด์‹œ ์ฝ”๋“œ(Hash Code)์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Hashing Algorithm)์€ ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ, ๋น„๋ฐ€๋ฒˆํ˜ธ ์ €์žฅ, ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ ๋“ฑ์˜ ์šฉ๋„๋กœ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
ํ•ด์‹œ ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋น ๋ฅด๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„์ฃผ ์•ฝ๊ฐ„๋งŒ ๋ฐ”๋€Œ์–ด๋„ ์™„์ „ํžˆ ๋‹ค๋ฅธ ํ•ด์‹œ๊ฐ’(Hash Value)์„ ์ƒ์„ฑํ•˜๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค” ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋ณด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Hashing Algorithm)์˜ ์ข…๋ฅ˜์™€ ๋ฐฉ์‹์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ •๋ณด๋กœ, ์ฃผ๋กœ ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๊ฒ€์ฆํ•˜๊ฑฐ๋‚˜ ์•”ํ˜ธํ™”๋œ ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
ํ•ด์‹ฑ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Œ์„ ํ™•์ธํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜๋ฉฐ, ํŠนํžˆ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ €์žฅ, ๋””์ง€ํ„ธ ์„œ๋ช…, ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ณด์•ˆ ๋ถ„์•ผ์—์„œ ํ•„์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ํŽ˜์ด๋กœ๋“œ(Payload)

  • ํ† ํฐ์˜ ์‹ค์ œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ๋ถ€๋ถ„์œผ๋กœ, ์‚ฌ์šฉ์ž ์ •๋ณด์™€ ๊ฐ™์€ ํด๋ ˆ์ž„(Claim)์„ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค” ํ† ํฐ์˜ ์‹ค์ œ ์ •๋ณด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

ํ† ํฐ์˜ ์‹ค์ œ ์ •๋ณด๋Š” ํ† ํฐ์— ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ์˜ ํ•ต์‹ฌ์ ์ธ ๋‚ด์šฉ์œผ๋กœ, ์ฃผ๋กœ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ •๋ณด๋‚˜ ์ธ์ฆ, ๊ถŒํ•œ์— ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ •๋ณด๋Š” JWT(JSON Web Token) ํ† ํฐ์˜ ํŽ˜์ด๋กœ๋“œ(Payload) ๋ถ€๋ถ„์— ์ €์žฅ๋˜๋ฉฐ, ํด๋ ˆ์ž„(Claim)์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค.
ํ† ํฐ์˜ ์‹ค์ œ ์ •๋ณด๋Š” ์ธ์ฆ์ด ํ•„์š”ํ•œ ์‹œ์Šคํ…œ์—์„œ ์„œ๋ฒ„๊ฐ€ ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ์‹ ์›์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ํŠน์ • ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๐Ÿค” ํด๋ ˆ์ž„(Claim)์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

JWT(JSON Web Token)์˜ ํŽ˜์ด๋กœ๋“œ(Payload) ๋ถ€๋ถ„์— ๋‹ด๊ธฐ๋Š” ์ •๋ณด๋กœ, ์‚ฌ์šฉ์ž ๋˜๋Š” ํ† ํฐ๊ณผ ๊ด€๋ จ๋œ ์†์„ฑ์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
ํด๋ ˆ์ž„(Claim)์€ ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์‹ ์›, ๊ถŒํ•œ, ํ† ํฐ์˜ ์œ ํšจ ๊ธฐ๊ฐ„ ๋“ฑ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
JWT(JSON Web Token)์˜ ํ•ต์‹ฌ ์š”์†Œ๋กœ, ํด๋ ˆ์ž„(Claim)์„ ํ†ตํ•ด ์ธ์ฆ๊ณผ ๊ถŒํ•œ ๋ถ€์—ฌ์— ํ•„์š”ํ•œ ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค” ํŽ˜์ด๋กœ๋“œ(Payload)๊ฐ€ ํ† ํฐ์˜ ์‹ค์ œ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?

ํ† ํฐ์„ ํ†ตํ•ด ์ธ์ฆ๊ณผ ๊ถŒํ•œ ๋ถ€์—ฌ์— ํ•„์š”ํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด์™€ ๊ธฐํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค.
JWT(JSON Web Token)๋Š” ์ฃผ๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์— ์ •๋ณด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ „์†กํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ, ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ํŽ˜์ด๋กœ๋“œ(Payload)์— ํฌํ•จํ•˜์—ฌ ์„œ๋ฒ„๊ฐ€ ์ถ”๊ฐ€ ์š”์ฒญ ์—†์ด ์‚ฌ์šฉ์ž ์ƒํƒœ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

  • ํด๋ ˆ์ž„(Claim)์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ์ž ์‹๋ณ„์ž(id), ์‚ฌ์šฉ์ž ๊ถŒํ•œ(role), ํ† ํฐ์˜ ์œ ํšจ ์‹œ๊ฐ„(expiration) ๋“ฑ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ: {"sub": "1234567890", "name": "Kobe", "admin": true}

๐Ÿค” ํด๋ ˆ์ž„(Claim)์—์„œ์˜ ์‚ฌ์šฉ์ž ์‹๋ณ„์ž(id)๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

์‚ฌ์šฉ์ž ์‹๋ณ„์ž(id)๋Š” JWT(JSON Web Token) ํ† ํฐ ๋‚ด์—์„œ ์‚ฌ์šฉ์ž๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์ด ์‹๋ณ„์ž๋Š” ์‚ฌ์šฉ์ž๋ฅผ ๊ตฌ๋ณ„ํ•˜๋Š” ์ฃผ์š” ์ •๋ณด๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ์„œ๋ฒ„๊ฐ€ ํŠน์ • ์‚ฌ์šฉ์ž๋ฅผ ์ธ์‹ํ•˜๊ณ  ์ธ์ฆ, ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ๊ธฐ์ค€์ด ๋˜๋Š” ์ •๋ณด์ž…๋‹ˆ๋‹ค.

๐Ÿค” ํด๋ ˆ์ž„(Claim)์—์„œ์˜ ์‚ฌ์šฉ์ž ๊ถŒํ•œ(role)์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

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

๐Ÿค” ํด๋ ˆ์ž„(Claim)์—์„œ์˜ ํ† ํฐ์˜ ์œ ํšจ ์‹œ๊ฐ„(expiration)์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

ํ† ํฐ์˜ ์œ ํšจ ์‹œ๊ฐ„(expiration)์€ JWT(JSON Web Token) ํ† ํฐ์ด ์œ ํšจํ•œ ๊ธฐ๊ฐ„์„ ์„ค์ •ํ•˜๋Š” ์†์„ฑ์œผ๋กœ, ํ† ํฐ์˜ ๋งŒ๋ฃŒ ์‹œ์ ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
์ด ์†์„ฑ์€ JWT(JSON Web Token)์˜ exp ํด๋ ˆ์ž„(Claim)์— ํฌํ•จ๋˜๋ฉฐ, ์ด ๊ฐ’์ด ์ง€๋‚˜๋ฉด ํ† ํฐ์€ ๋” ์ด์ƒ ์œ ํšจํ•˜์ง€ ์•Š๋‹ค๊ณ  ๊ฐ„์ฃผ๋˜์–ด ์ธ์ฆ๊ณผ ๊ถŒํ•œ ๋ถ€์—ฌ ์š”์ฒญ ์‹œ ๊ฑฐ๋ถ€๋ฉ๋‹ˆ๋‹ค.

๐Ÿค” ํด๋ ˆ์ž„(Claim)์—์„œ ์‚ฌ์šฉ์ž ์‹๋ณ„์ž(id), ์‚ฌ์šฉ์ž ๊ถŒํ•œ(role), ํ† ํฐ์˜ ์œ ํšจ ์‹œ๊ฐ„(expiration) ๋“ฑ์„ ํฌํ•จํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?

์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๊ด€๋ฆฌ๋ฅผ ํšจ์œจ์ ์ด๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ํ•œ ๊ณณ์— ๋ชจ์•„ ๋‘๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ์ •๋ณด๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๋Š” ๋ณ„๋„์˜ ์ถ”๊ฐ€ ์ž‘์—… ์—†์ด ์‚ฌ์šฉ์ž์˜ ์‹ ์›๊ณผ ๊ถŒํ•œ, ํ† ํฐ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ํšจ์œจ์ ์ด๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ธ์ฆ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3๏ธโƒฃ ์„œ๋ช…(Signature)

  • ํ† ํฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ์„œ๋ช…์œผ๋กœ, ํ—ค๋”(Header)์™€ ํŽ˜์ด๋กœ๋“œ(Payload)๋ฅผ ํ•ฉ์นœ ํ›„ ๋น„๋ฐ€ ํ‚ค๋กœ ํ•ด์‹ฑ(Hashing)ํ•˜์—ฌ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๐Ÿค” ํ† ํฐ์˜ ๋ฌด๊ฒฐ์„ฑ(Token Integrity)

ํ† ํฐ์˜ ๋‚ด์šฉ์ด ๋ฐœ๊ธ‰๋œ ์ดํ›„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Œ์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
๋ฌด๊ฒฐ์„ฑ์ด ์œ ์ง€๋œ ํ† ํฐ์€ ๋ฐœ๊ธ‰ ์‹œ์ ์˜ ์ •๋ณด๋ฅผ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋ฉฐ, ๊ทธ ๋‚ด์šฉ์ด ์ค‘๊ฐ„์— ์กฐ์ž‘๋˜์ง€ ์•Š์•˜์Œ์„ ํ™•์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฌด๊ฒฐ์„ฑ์€ ํ† ํฐ์˜ ์•ˆ์ „ํ•œ ์ธ์ฆ๊ณผ ๊ถŒํ•œ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ํ•„์ˆ˜์ ์ธ ์š”์†Œ์ž…๋‹ˆ๋‹ค.

๐Ÿค” ๋น„๋ฐ€ ํ‚ค(Secret Key)

๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•˜๊ฑฐ๋‚˜ ์ธ์ฆํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ฐ€ ์ •๋ณด๋กœ, ์˜ค์ง ์†ก์‹ ์ž์™€ ์ˆ˜์‹ ์ž๋งŒ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•˜๋Š” ํ‚ค์ž…๋‹ˆ๋‹ค.
๋น„๋ฐ€ ํ‚ค๋Š” ๋Œ€์นญ ์•”ํ˜ธํ™”์™€ HMAC ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ์ „์†ก ์ค‘ ๋ฐ์ดํ„ฐ์˜ ์•ˆ์ „์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์„œ๋ช…์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํŽ˜์ด๋กœ๋“œ(Payload)์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ณด์žฅํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ: HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
    • JWT๋Š” ์œ„์˜ ์„ธ ๊ฐ€์ง€๋ฅผ ํ•ฉ์ณ์„œ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด๋กœ ๋งŒ๋“ค๊ณ , ๊ฐ ๋ถ€๋ถ„์„ .์œผ๋กœ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ JWT์˜ ์˜ˆ์‹œ.

  • JWT(JSON Web Token)๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ธ ๋ถ€๋ถ„์ด ํ•ฉ์ณ์ง„ ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
  • ์ด ๋ฌธ์ž์—ด์€ ํ—ค๋”(header), ํŽ˜์ด๋กœ๋“œ(payload), ์„œ๋ช…(signature)์ด ๊ฒฐํ•ฉ๋œ ๊ฒƒ์ด๋ฉฐ, ๊ฐ ๋ถ€๋ถ„์€ Base64URL๋กœ ์ธ์ฝ”๋”ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค” Base64URL์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

Base64URL์€ Base64 ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์„ URL ๋ฐ ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€ํ˜•ํ•œ ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์ธ Base64 ์ธ์ฝ”๋”ฉ์€ ๋ฌธ์ž์—ด์„ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋กœ๋ถ€ํ„ฐ ASCII ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•˜์ง€๋งŒ, ๋ณ€ํ™˜๋œ ๊ฒฐ๊ณผ์—๋Š” URL์—์„œ ํŠน๋ณ„ํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋Š” ๋ฌธ์ž(+, /, =)๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์–ด URL ์ธ์ฝ”๋”ฉ์„ ์ถ”๊ฐ€๋กœ ํ•ด์•ผ ํ•˜๋Š” ๋ถˆํŽธํ•จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
Base64URL์€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์—ฌ, Base64 ์ธ์ฝ”๋”ฉ์„ URL๊ณผ ํŒŒ์ผ ๊ฒฝ๋กœ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๐Ÿค” ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ(Binary Data)

์ปดํ“จํ„ฐ๊ฐ€ 2์ง„์ˆ˜(0๊ณผ 1)๋กœ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ์™€ ๋‹ฌ๋ฆฌ ์‚ฌ๋žŒ์ด ์ง์ ‘ ์ฝ๊ฑฐ๋‚˜ ํ•ด์„ํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฐ์ดํ„ฐ ํ˜•์‹์ž…๋‹ˆ๋‹ค.
์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” ๊ถ๊ทน์ ์œผ๋กœ 0๊ณผ 1์˜ ์ด์ง„์ˆ˜ ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜๊ณ  ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฏธ์ง€, ์˜ค๋””์˜ค, ๋น„๋””์˜ค, ์‹คํ–‰ ํŒŒ์ผ ๋“ฑ ๋‹ค์–‘ํ•œ ํŒŒ์ผ ํ˜•์‹์ด ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

๐Ÿค” Base64๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ…์ŠคํŠธ ํ˜•์‹์œผ๋กœ ์ธ์ฝ”๋”ฉํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
์ปดํ“จํ„ฐ์—์„œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ(์˜ˆ: ์ด๋ฏธ์ง€, ์˜ค๋””์˜ค ๋“ฑ)๋ฅผ ASCII ๋ฌธ์ž๋งŒ๋“œ๋กœ ํ‘œํ˜„ํ•˜์—ฌ ์ „์†กํ•˜๊ฑฐ๋‚˜ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.
Base64๋Š” ์ฃผ๋กœ ์ด๋ฉ”์ผ, ์›น API, URL์—์„œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ JWT์˜ ํŠน์ง•.

1๏ธโƒฃ ์ž๊ธฐ ํฌํ•จ ํ† ํฐ.

  • JWT(JSON Web Token)๋Š” ๋ชจ๋“  ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ž์ฒด์ ์œผ๋กœ ํฌํ•จํ•˜๋ฏ€๋กœ, ์„œ๋ฒ„๊ฐ€ ํ† ํฐ๋งŒ ํ™•์ธํ•ด๋„ ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ํ†ตํ•ด ์„ธ์…˜ ์ €์žฅ์†Œ ์—†์ด๋„ ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค” ์„ธ์…˜ ์ €์žฅ์†Œ(Session Store)๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

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

๐Ÿค” ์„ธ์…˜ ์ •๋ณด(Session Information)์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

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

๐Ÿค” ์„ธ์…˜(Session)์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํŠน์ • ์‚ฌ์šฉ์ž์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ธฐ๊ฐ„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ๋“ค์„ ํ•˜๋‚˜์˜ ์—ฐ์†์ ์ธ ํ๋ฆ„์œผ๋กœ ์‹๋ณ„ํ•˜๊ณ  ์ƒํƒœ๋ฅผ ์ง€์†์ ์œผ๋กœ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž๊ฐ€ ์›น์‚ฌ์ดํŠธ์— ์ ‘์†ํ•˜๊ณ  ๋กœ๊ทธ์•„์›ƒํ•˜๊ฑฐ๋‚˜ ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ํ™œ๋™์ด ์—†์œผ๋ฉด ์„ธ์…˜(Session)์ด ์ข…๋ฃŒ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ์„ธ์…˜(Session)์€ ์‚ฌ์šฉ์ž๊ฐ€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ‘์†ํ•ด ์žˆ๋Š” ๋™์•ˆ์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ๋ณ€์กฐ ๋ฐฉ์ง€.

  • JWT(JSON Web Token)๋Š” ์„œ๋ช…(Signature)์„ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด, ํ† ํฐ์ด ๋ณ€์กฐ๋˜์ง€ ์•Š์•˜์Œ์„ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ† ํฐ์˜ ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฒฝ์šฐ, ์„œ๋ช… ๊ฒ€์ฆ์ด ์‹คํŒจํ•˜๋ฏ€๋กœ ์œ ํšจํ•˜์ง€ ์•Š์€ ํ† ํฐ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ์งง์€ ์ˆ˜๋ช….

  • JWT(JSON Web Token)๋Š” ๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ์งง์€ ์œ ํšจ ๊ธฐ๊ฐ„์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.
  • ๋งŒ๋ฃŒ๋œ ํ† ํฐ์€ ๋‹ค์‹œ ์ธ์ฆ์„ ์š”์ฒญํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์ฃผ๊ธฐ์ ์œผ๋กœ ์žฌ๋ฐœ๊ธ‰์„ ํ†ตํ•ด ๋ณด์•ˆ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4๏ธโƒฃ ๋น„์ƒํƒœ์„ฑ(Stateless)

  • JWT(JSON Web Token)๋Š” ์„œ๋ฒ„์— ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๋Š” ๋น„์ƒํƒœ์„ฑ(Stateless) ํ† ํฐ์ด๋ฏ€๋กœ, ํ™•์žฅ์„ฑ๊ณผ ์„ฑ๋Šฅ์ด ์š”๊ตฌ๋˜๋Š” ํ™˜๊ฒฝ์—์„œ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

๐Ÿค” ๋น„์ƒํƒœ์„ฑ(Stateless)๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

๊ฐ ์š”์ฒญ์ด ์ด์ „ ์š”์ฒญ์ด๋‚˜ ์ดํ›„ ์š”์ฒญ๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ํŠน์„ฑ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
๋น„์ƒํƒœ์ ์ธ ์‹œ์Šคํ…œ์—์„œ๋Š” ๊ฐ ์š”์ฒญ์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๊ฐ€ ์š”์ฒญ ์ž์ฒด์— ํฌํ•จ ๋˜์–ด์•ผ ํ•˜๋ฉฐ, ์„œ๋ฒ„๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์ด์ „ ์ƒํƒœ๋‚˜ ์„ธ์…˜(Session)์„ ๊ธฐ์–ตํ•˜์ง€ ์•Š๊ณ  ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ์š”์ฒญ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • ์„œ๋ฒ„๋Š” ํ† ํฐ์„ ํ™•์ธํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋ฏ€๋กœ, ์„ธ์…˜(Session) ๊ด€๋ฆฌ๊ฐ€ ํ•„์š” ์—†๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

4๏ธโƒฃ JWT์˜ ๋‹จ์ .

1๏ธโƒฃ ์„œ๋ฒ„์—์„œ ํ† ํฐ ๋ฌดํšจํ™”๊ฐ€ ์–ด๋ ต๋‹ค.

  • JWT(JSON Web Token)๋Š” ์„œ๋ฒ„์—์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•œ ํ›„ ํŠน์ • ํ† ํฐ์„ ์„œ๋ฒ„์—์„œ ๋ฌดํšจํ™”ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๐Ÿค” ํ† ํฐ ๋ฌดํšจํ™”(Token Invalidation)๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

๊ธฐ์กด์— ๋ฐœ๊ธ‰๋œ ํ† ํฐ์„ ๋” ์ด์ƒ ์œ ํšจํ•˜์ง€ ์•Š๋„๋ก ๋งŒ๋“œ๋Š” ๊ณผ์ •์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
๋ฌดํšจํ™”๋œ ํ† ํฐ์€ ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ํ† ํฐ์„ ํ†ตํ•ด ์ธ์ฆ์ด๋‚˜ ๊ถŒํ•œ์„ ์š”์ฒญํ•  ๋•Œ ๊ฑฐ๋ถ€๋˜๋ฉฐ, ์ฃผ๋กœ ๋กœ๊ทธ์•„์›ƒ ์ฒ˜๋ฆฌ, ๋ณด์•ˆ์ƒ์˜ ์ด์œ , ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ ์‹œ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค

  • ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ๋‚˜ ์งง์€ ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค” ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ(Blacklist)

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

JWT์—์„œ์˜ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ(Blacklist)๋Š” ํŠน์ • JWT ํ† ํฐ์„ ๋ฌดํšจํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ฐจ๋‹จ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
๋ธ”๋ž™๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€๋œ ํ† ํฐ์€ ๋” ์ด์ƒ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜์–ด, ํ•ด๋‹น ํ† ํฐ์œผ๋กœ ์ธ์ฆ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์ธ์ฆ์ด ๊ฑฐ๋ถ€๋˜๊ฑฐ๋‚˜ ์ ‘๊ทผ์ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
์ด๋Š” ๋กœ๊ทธ์•„์›ƒ ์ฒ˜๋ฆฌ, ํ† ํฐ ์œ ํšจ๊ธฐ๊ฐ„ ์ด๋‚ด์— ๊ฐ•์ œ ๋ฌดํšจํ™”, ๋ณด์•ˆ์ƒ ์ด์œ ๋กœ ํƒˆ์ทจ๋œ ํ† ํฐ์„ ์ฐจ๋‹จํ•ด์•ผ ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ํ† ํฐ์˜ ํฌ๊ธฐ๊ฐ€ ํฌ๋‹ค.

  • JWT(JSON Web Token)๋Š” ์„œ๋ช…(Signature)๊ณผ ํŽ˜์ด๋กœ๋“œ(Payload)๋ฅผ ํฌํ•จํ•˜๋ฏ€๋กœ ํฌ๊ธฐ๊ฐ€ ํฐ ํŽธ์ž…๋‹ˆ๋‹ค.
    • ์ด๋Š” ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค” ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ(Network Traffic)์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ „์†ก๋˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ธํ„ฐ๋„ท์„ ํ†ตํ•ด ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐ์ดํ„ฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์˜ ํ†ต์‹ , ์„œ๋ฒ„ ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ตํ™˜ ๋“ฑ ๋„คํŠธ์›Œํฌ ์ƒ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋ฉฐ,
๋ณดํ†ต ์ดˆ๋‹น ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์–‘์œผ๋กœ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค” ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

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

๐Ÿค” ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋ฐฉํ–ฅ์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

๋ฐ์ดํ„ฐ ํ๋ฆ„์€ ์ƒํ–ฅ ํ๋ฆ„(upload)๊ณผ ํ•˜ํ–ฅ ํ๋ฆ„(download)์œผ๋กœ ๊ตฌ๋ถ„๋˜๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์— ์ฃผ๊ณ ๋ฐ›์Šต๋‹ˆ๋‹ค.

์ƒํ–ฅ ํ๋ฆ„(Upload)๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งํ•˜๋ฉฐ, ํŒŒ์ผ์˜ ์—…๋กœ๋“œ๋ฅผ ์˜ˆ๋กœ ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜ํ–ฅ ํ๋ฆ„(Download)๋Š” ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งํ•˜๋ฉฐ, ์›นํŽ˜์ด์ง€ ๋กœ๋”ฉ, ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ ๋“ฑ์„ ์˜ˆ๋กœ ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค” ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์†ก๋˜๋Š” ๊ณผ์ •์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์†ก๋˜๋Š” ๊ณผ์ •์€ ๋ฐœ์‹ ์ž(์ถœ๋ฐœ์ง€)์—์„œ ์ˆ˜์‹ ์ž(๋ชฉ์ ์ง€)๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ํŒจํ‚ท(Packet)์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ์ด๋ฅผ ์—ฌ๋Ÿฌ ๋„คํŠธ์›Œํฌ ์žฅ์น˜๋ฅผ ๊ฑฐ์ณ ์ „๋‹ฌํ•˜๋Š” ์ผ๋ จ์˜ ์ ˆ์ฐจ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์€ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋กœ ๋‚˜๋‰˜๋ฉฐ, ํ”„๋กœํ† ์ฝœ ์Šคํƒ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ์†ก์‹  ์žฅ์น˜์—์„œ ์ˆ˜์‹  ์žฅ์น˜๋กœ ์•ˆ์ „ํ•˜๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ์ „์†ก๋˜๋„๋ก ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

๐Ÿค” ํ”„๋กœํ† ์ฝœ ์Šคํƒ(Protocol Stack)์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

๋„คํŠธ์›Œํฌ ํ†ต์‹ ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹ ํ•˜๊ธฐ ์œ„ํ•ด ๊ณ„์ธต๋ณ„๋กœ ์—ญํ• ์„ ๋‚˜๋ˆ  ํ”„๋กœํ† ์ฝœ์„ ๊ตฌ์„ฑํ•œ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.
์ด ์Šคํƒ์€ ๋„คํŠธ์›Œํฌ ํ†ต์‹  ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ๊ฐ ๊ณ„์ธต์— ํŠน์ • ์—ญํ• ์„ ๋ถ€์—ฌํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†ก, ์ฒ˜๋ฆฌ, ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๊ฐ ๊ณ„์ธต์€ ๋…๋ฆฝ์ ์ด๋ฉฐ, ์ƒํ˜ธ ์ž‘์šฉ์„ ํ†ตํ•ด ์ตœ์ข…์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชฉ์ ์ง€์— ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ํƒˆ์ทจ๋œ ํ† ํฐ์˜ ์•…์šฉ ๊ฐ€๋Šฅ์„ฑ.

  • ๋งŒ๋ฃŒ๋˜์ง€ ์•Š์€ JWT(JSON Web Token)๊ฐ€ ํƒˆ์ทจ๋œ ๊ฒฝ์šฐ, ๊ณต๊ฒฉ์ž๊ฐ€ ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๋กœ ์œ„์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด HTTPS๋ฅผ ํ†ตํ•œ ์ „์†ก ๋ฐ ์งง์€ ์œ ํšจ ๊ธฐ๊ฐ„ ์„ค์ •์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค” HTTPS๋ฅผ ํ†ตํ•œ ์ „์†ก์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

์›น ๋ธŒ๋ผ์šฐ์ €์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ํ†ต์‹ ์ด ์•”ํ˜ธํ™”๋œ ์ƒํƒœ๋กœ ์ด๋ฃจ์–ด์ง€๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
HTTPS๋Š” HTTP์— SSL(Secure Sockets Layer) ๋˜๋Š” TLS(Transport Layer Security) ์•”ํ˜ธํ™” ๊ณ„์ธต์„ ์ถ”๊ฐ€ํ•œ ํ”„๋กœํ† ์ฝœ๋กœ,
์‚ฌ์šฉ์ž๊ฐ€ ์›น์‚ฌ์ดํŠธ์™€ ์ฃผ๊ณ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ3์ž๊ฐ€ ๋ณผ ์ˆ˜ ์—†๋„๋ก ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฅผ ํ†ตํ•ด, ์›น์‚ฌ์ดํŠธ ๋กœ๊ทธ์ธ ์ •๋ณด, ์‹ ์šฉ์นด๋“œ ๋ฒˆํ˜ธ, ๊ฐœ์ธ ์ •๋ณด ๋“ฑ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์•ˆ์ „ํ•˜๊ฒŒ ์ „์†ก๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค” HTTP(HyperText Transfer Protocol)์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

์›น ๋ธŒ๋ผ์šฐ์ €์™€ ์›น ์„œ๋ฒ„ ๊ฐ„์— ํ•˜์ดํผํ…์ŠคํŠธ(HyperText)๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ๋กœ, ์ธํ„ฐ๋„ท ์ƒ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ํ‘œ์ค€ ๊ทœ์•ฝ์ž…๋‹ˆ๋‹ค.

HTTP(HyperText Transfer Protocol)๋Š” ์›น ํŽ˜์ด์ง€, ์ด๋ฏธ์ง€, ๋น„๋””์˜ค์™€ ๊ฐ™์€ ๋ฆฌ์†Œ์Šค๋ฅผ ์ „์†กํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์—ญํ• ์„ ํ•˜๊ณ , ์›น ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค” ํ•˜์ดํผํ…์ŠคํŠธ(HyperText)๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

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

๐Ÿค” SSL(Secure Sockets Layer)๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ ๋ณด์•ˆ ํ”„๋กœํ† ์ฝœ๋กœ, ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์„ ์•”ํ˜ธํ™”ํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ๊ธฐ๋ฐ€์„ฑ, ๋ฌด๊ฒฐ์„ฑ, ์ธ์ฆ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

SSL(Secure Sockets Layer)์€ ์›น์‚ฌ์ดํŠธ๊ฐ€ HTTPS ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฉฐ, ์ฃผ๋กœ ์ธํ„ฐ๋„ท ์ƒ์˜ ๋ฏผ๊ฐํ•œ ์ •๋ณด(์˜ˆ: ๋กœ๊ทธ์ธ ์ •๋ณด, ๊ฒฐ์ œ ์ •๋ณด) ๋ณดํ˜ธ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๐Ÿค” TLS(Transport Layer Security)๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

์ธํ„ฐ๋„ท ์ƒ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ ๋ณด์•ˆ ํ”„๋กœํ† ์ฝœ๋กœ, SSL(Secure Sockets Layer)์˜ ํ›„์† ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.
TLS(Transport Layer Security)๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์•”ํ˜ธํ™”ํ•˜์—ฌ ๊ธฐ๋ฐ€์„ฑ๊ณผ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•˜๋ฉฐ, ํ˜„์žฌ ๋Œ€๋ถ€๋ถ„์˜ HTTPS ์—ฐ๊ฒฐ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
TLS(Transport Layer Security)๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ค‘๊ฐ„์— ํƒˆ์ทจ๋˜๊ฑฐ๋‚˜ ์กฐ์ž‘๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์—ฌ, ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ „์†กํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.

5๏ธโƒฃ JWT์˜ ์‚ฌ์šฉ ์˜ˆ์‹œ(Java)

  • Java์—์„œ JWT๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, JJWT(Java JWT) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ† ํฐ์„ ์ƒ์„ฑํ•˜๊ณ  ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.Claims;

public class JwtExample {
    private static final String SECRET_KEY = "mySecreKey";
    
    // JWT ํ† ํฐ ์ƒ์„ฑ
    public static String createToken(String subject) {
        return Jwts.builder()
            .setSubject(subject)            // ์‚ฌ์šฉ์ž ์‹๋ณ„์ž(id)
            .setIssuedAt(new Date())        // ๋ฐœํ–‰ ์‹œ๊ฐ„
            .setExpiration(new Date(System.currentTimeMillis() * 3600000)) // ๋งŒ๋ฃŒ ์‹œ๊ฐ„(expiration)-1์‹œ๊ฐ„ ํ›„
            .signWith(SignatureAlgorithm.HS256, SECRET_KEY) // ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฐ ํ‚ค
            .compact();
    }
    
    // JWT ํ† ํฐ ๊ฒ€์ฆ ๋ฐ ์ •๋ณด ์ถ”์ถœ
    public static Claims parseToken(String token) {
        return Jwts.parse()
            .setSigningKey(SECRET_KEY)
            .parseClaimsJwt(token)
            .getBody();
    }
    
    public static void main(String[] args) {
        // ํ† ํฐ ์ƒ์„ฑ
        String token = createToken("user123");
        System.out.println("JWT Token: " + token);
        
        // ํ† ํฐ ๊ฒ€์ฆ ๋ฐ ์ •๋ณด ์ถ”์ถœ
        Claims claims = parseToken(token);
        System.out.println("Subject: " + clamis.getSubject());
    }
}

๐Ÿ‘‰ ์„ค๋ช….

  • createToken ๋ฉ”์„œ๋“œ๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ JWT ํ† ํฐ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • parseToken ๋ฉ”์„œ๋“œ๋Š” ์ƒ์„ฑ๋œ ํ† ํฐ์„ ๊ฒ€์ฆํ•˜๊ณ  ํŽ˜์ด๋กœ๋“œ์˜ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ์˜ˆ์ œ์—์„œ๋Š” user123์ด๋ผ๋Š” ์‚ฌ์šฉ์ž ์‹๋ณ„์ž๋กœ ํ† ํฐ์„ ์ƒ์„ฑํ•˜๊ณ , ์ƒ์„ฑ๋œ ํ† ํฐ์—์„œ ์‚ฌ์šฉ์ž ์‹๋ณ„์ž(subject)๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.

6๏ธโƒฃ JWT์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€.

1๏ธโƒฃ ์‚ฌ์šฉ์ž ์ธ์ฆ.

  • ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋กœ๊ทธ์ธ ํ›„ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๋Š”๋ฐ JWT๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ์ถ”๊ฐ€์ ์ธ ์„ธ์…˜ ๊ด€๋ฆฌ ์—†์ด ์ธ์ฆ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2๏ธโƒฃ API ์ธ์ฆ.

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

๐Ÿค” RESTful API๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

REST(Representational State Transfer) ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„๋œ API๋กœ, ์›น์—์„œ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์— ๋ฆฌ์†Œ์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•œ ๊ทœ์น™๊ณผ ์›์น™์„ ๋”ฐ๋ฅด๋Š” API์ž…๋‹ˆ๋‹ค.

RESTful API๋Š” HTTP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ์›น์˜ ๋ฆฌ์†Œ์Šค(Resource)๋ฅผ URL์„ ํ†ตํ•ด ์ ‘๊ทผํ•˜๊ณ , HTTP ๋ฉ”์„œ๋“œ(GET, POST, PUT, DELETE ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ์กฐ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค” REST(Representational State Transfer) ์•„ํ‚คํ…์ฒ˜๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

์›น ๊ธฐ๋ฐ˜์˜ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•˜๊ธฐ ์œ„ํ•œ ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ๋กœ, ๋ฆฌ์†Œ์Šค(Resource)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์ƒํƒœ ์ •๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

REST๋Š” HTTP ํ”„๋กœํ† ์ฝœ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ, ์›น์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์ด๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•ด ๊ถŒ์žฅ๋˜๋Š” ์›์น™๊ณผ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

REST ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ์€ ์ฃผ๋กœ ์›น API ์„ค๊ณ„์— ์ ์šฉ๋˜๋ฉฐ, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์˜ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ๋•Œ ์ผ๊ด€์„ฑ ์žˆ๋Š” ๋ฐฉ์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
REST๋Š” ํŠน์ •ํ•œ ํ‘œ์ค€์ด๋‚˜ ํ”„๋กœํ† ์ฝœ์ด ์•„๋‹ˆ๋ฉฐ, ์„ค๊ณ„ ์›์น™์— ๋”ฐ๋ฅธ ์›น ์„œ๋น„์Šค ๊ตฌ์กฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค” REST์—์„œ์˜ ๋ฆฌ์†Œ์Šค(Resource)๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

์›น์—์„œ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋‚˜ ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
REST ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ๋ฆฌ์†Œ์Šค(Resource)๋ฅผ ํ†ตํ•ด ์›น ์„œ๋น„์Šค๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋‚˜ ๊ธฐ๋Šฅ์„ ์ถ”์ƒํ™”ํ•œ ๊ฐœ์ฒด๋กœ, ๋ฆฌ์†Œ์Šค๋Š” URI(Uniform Resource Identifier)๋ฅผ ํ†ตํ•ด ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„๋ฉ๋‹ˆ๋‹ค.
RESTful API์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ฆฌ์†Œ์Šค(Resource)์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ HTTP ๋ฉ”์„œ๋“œ(GET, POST, PUT, DELETE ๋“ฑ)๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•˜๊ณ  ์กฐ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค” URI(Uniform Resource Identifier)๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

์›น์—์„œ ํŠน์ • ๋ฆฌ์†Œ์Šค๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ณ ์œ ํ•œ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
์›น ๋ฆฌ์†Œ์Šค๋ฅผ ์œ ์ผํ•˜๊ฒŒ ์‹๋ณ„ํ•˜์—ฌ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋œ URI(Uniform Resource Identifier)๋Š” ์›น ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋ฉฐ,
์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์ ‘ํ•˜๋Š” URL๋„ URI์˜ ํ•œ ์ข…๋ฅ˜์ž…๋‹ˆ๋‹ค.
URI๋Š” RESTful API์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ์‹๋ณ„ํ•˜๋Š” ์ค‘์š”ํ•œ ์š”์†Œ๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ •ํ™•ํžˆ ์ฐพ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ(Distributed System)์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

์—ฌ๋Ÿฌ ๋Œ€์˜ ์ปดํ“จํ„ฐ๋‚˜ ์„œ๋ฒ„๊ฐ€ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ๋˜์–ด ํ•˜๋‚˜์˜ ์‹œ์Šคํ…œ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
๋ถ„์‚ฐ ์‹œ์Šคํ…œ(Distributed System)์—์„œ๋Š” ํ•˜๋‚˜์˜ ์ž‘์—…์„ ์—ฌ๋Ÿฌ ์žฅ์น˜์—์„œ ๋‚˜๋ˆ„์–ด ์ฒ˜๋ฆฌํ•˜์—ฌ, ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์†๋„์™€ ํšจ์œจ์„ฑ์„ ๋†’์ด๊ณ , ๋‹จ์ผ ์žฅ์•  ์ง€์ ์„ ์ค„์—ฌ ์‹œ์Šคํ…œ์˜ ์‹ ๋ขฐ์„ฑ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3๏ธโƒฃ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ฐ„์˜ ํ†ต์‹ .

  • JWT๋Š” ์„œ๋ฒ„ ๊ฐ„ ์ธ์ฆ์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์—์„œ ๊ฐ ์„œ๋น„์Šค๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ JWT๋ฅผ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์•ˆ์ „ํ•˜๊ณ  ํšจ์œจ์ ์ธ ์ธ์ฆ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜(Microservices Architecture)๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ๋…๋ฆฝ์ ์ธ ์„œ๋น„์Šค๋กœ ๋‚˜๋ˆ ์„œ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
๊ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค(Microservices)๋Š” ํŠน์ • ๊ธฐ๋Šฅ์ด๋‚˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์„œ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœ, ๋ฐฐํฌ, ํ™•์žฅ, ์œ ์ง€๋ณด์ˆ˜ํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์•„ํ‚คํ…์ฒ˜๋Š” ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์œ ์—ฐ์„ ๊ณผ ํ™•์žฅ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

7๏ธโƒฃ ์š”์•ฝ.

  • JWT(JSON Web Token)์€ ์•ˆ์ „ํ•˜๊ณ  ๊ฐ„ํŽธํ•œ ์ธ์ฆ๊ณผ ์ •๋ณด ์ „์†ก์„ ์œ„ํ•œ ํ† ํฐ์œผ๋กœ, ๋””์ง€ํ„ธ ์„œ๋ช…์„ ํ†ตํ•ด ํ† ํฐ์ด ๋ณ€์กฐ๋˜์ง€ ์•Š์•˜์Œ์„ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • JWT๋Š” ์ฃผ๋กœ ์‚ฌ์šฉ์ž ์ธ์ฆ๊ณผ API ์ ‘๊ทผ ์ œ์–ด ๋“ฑ์— ์‚ฌ์šฉ๋˜๋ฉฐ, ์ž๊ธฐ ํฌํ•จ ํ† ํฐ์ด๋ฏ€๋กœ ๋ณ„๋„์˜ ์„ธ์…˜ ์ €์žฅ์†Œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Java์—์„œ JWT๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฒ€์ฆํ•˜๋ ค๋ฉด JJWT ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๊ฐ„ํŽธํ•˜๊ฒŒ ํ† ํฐ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.