๐ŸŒ Backend/๐Ÿƒ Spring

์ฟ ํ‚ค, ์„ธ์…˜, ํ† ํฐ, Hybrid ํ† ํฐ ์ธ์ฆ ๋ฐฉ์‹์˜ ์ฐจ์ด

DevPoong 2023. 9. 11. 17:30

์ธ์ฆ์˜ ํ•„์š”์„ฑ

HTTP ํ†ต์‹ ์€ ์š”์ฒญ๊ณผ ์‘๋‹ต์ด ์ข…๋ฃŒ๋˜๋ฉด ์—ฐ๊ฒฐ์„ ๋Š๋Š” Connectionless ํŠน์„ฑ๊ณผ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๋ฉด ์–ด๋– ํ•œ ์ƒํƒœ๋„ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š” Statelessํ•œ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด๋‹ค.

๋”ฐ๋ผ์„œ, ๋กœ๊ทธ์ธ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฟ ํ‚ค, ์„ธ์…˜, ํ† ํฐ์„ ์‚ฌ์šฉํ•œ๋‹ค.

  • Connectionless ํ”„๋กœํ† ์ฝœ
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญํ•˜๊ณ  ์‘๋‹ต์„ ๋ฐ›์œผ๋ฉด ์—ฐ๊ฒฐ์„ ๋Š๋Š” ์ฒ˜๋ฆฌ ๋ฐฉ์‹
  • Stateless ํ”„๋กœํ† ์ฝœ
    • ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ ์ •๋ณด๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š” ์„œ๋ฒ„ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด๋‹ค.

 

 

1. ์ฟ ํ‚ค ๐Ÿช

์ฟ ํ‚ค๋Š” Key-Value ํ˜•์‹์˜ ๋ฌธ์ž์—ด๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋งก๊ฒจ๋„ ๋˜๋Š” ๊ณต๊ฐœ ๊ฐ€๋Šฅํ•œ ์ •๋ณด๋ฅผ ์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ์‹œํ‚จ๋‹ค.

์ฟ ํ‚ค ๋™์ž‘ ๋ฐฉ์‹

  • ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ๋กœ๊ทธ์ธ ์š”์ฒญ์— ๋Œ€ํ•ด ์‘๋‹ตํ•  ๋•Œ, ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ์ž‘์€ ์ •๋ณด๋ฅผ Response Header์˜ set-cookie์— ๋‹ด๋Š”๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ ์ธก ๋ธŒ๋ผ์šฐ์ €๋Š” ํ•ด๋‹น ์ฟ ํ‚ค๋ฅผ ์ฟ ํ‚ค ์ €์žฅ์†Œ์— ์ €์žฅํ•˜๊ณ  ๋‹ค๋ฅธ ์š”์ฒญ์„ ํ•  ๋•Œ๋งˆ๋‹ค ์ €์žฅ๋œ ์ฟ ํ‚ค๋ฅผ Request Header์˜ cookie์— ๋‹ด๋Š”๋‹ค.
  • ์„œ๋ฒ„๋Š” ์ „๋‹ฌ๋ฐ›์€ ์ฟ ํ‚ค๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ฟ ํ‚ค๋Š” ๋ธŒ๋ผ์šฐ์ € ๋‚ด์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— document.cookie๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์ฟ ํ‚ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ  ์ด๋ฅผ ์ด์šฉํ•ด ์ฟ ํ‚ค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—ด์–ด๋ณด๊ฑฐ๋‚˜ ์•…์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ์— ์ทจ์•ฝํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ์ ˆ๋Œ€ ๊ฐœ์ธ์ ์ธ ๋น„๋ฐ€ ์ •๋ณด๋“ค์„ ์ฟ ํ‚ค์— ์ €์žฅํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ๋ณด์•ˆ์— ๋ฏผ๊ฐํ•œ ์‚ฌ์ดํŠธ์—์„œ๋Š” ๋งŒ๋ฃŒ๊ธฐํ•œ์„ ์งง๊ฒŒ ๊ฐ€์ ธ๊ฐ€๋Š”๊ฒŒ ์ข‹๋‹ค.

 

Secure ์ฟ ํ‚ค

Secure ์ฟ ํ‚ค๋Š” HTTPS ํ”„๋กœํ† ์ฝœ ์ƒ์—์„œ ์•”ํ˜ธํ™”๋œ ์š”์ฒญ์ผ ๋•Œ๋งŒ ์ „์†ก๋˜๋Š” ์ฟ ํ‚ค์ด๋‹ค.

 

HttpOnly ์ฟ ํ‚ค

HttpOnly ์ฟ ํ‚ค๋Š” XSS ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด document.cookie์™€ ๊ฐ™์€ JS๋กœ ์ฟ ํ‚ค๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์•„์ค€๋‹ค.
ํ•ด๋‹น ๋ฐฉ์‹์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฟ ํ‚ค๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์—†๊ณ , ์„œ๋ฒ„๋กœ ์š”์ฒญ ๋ณด๋‚ผ ๋•Œ ์•Œ์•„์„œ ๊ฐ™์ด ์ „์†ก๋œ๋‹ค.

 

Secure ์ฟ ํ‚ค์™€ HttpOnly ์ฟ ํ‚ค๋ฅผ ์ ์šฉํ•˜๋”๋ผ๋„ ์ฟ ํ‚ค๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ์•ˆ์ „ํ•˜์ง€ ์•Š๊ณ  ๋ณด์•ˆ์„ ์‹ค์งˆ์ ์œผ๋กœ ์ œ๊ณตํ•˜์ง€๋Š” ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•ด์„œ๋Š” ์•ˆ๋˜๋Š”๊ฑด ๋˜‘๊ฐ™๋‹ค.

 

 

2. ์„ธ์…˜ ๐Ÿ”—

์„ธ์…˜์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์„ ํ•œ ์‹œ์ ๋ถ€ํ„ฐ ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ข…๋ฃŒํ•˜์—ฌ ์—ฐ๊ฒฐ์„ ๋๋‚ด๋Š” ์‹œ์ ๊นŒ์ง€ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. (Stateful)

 

์„ธ์…˜์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ฟ ํ‚ค ๋Œ€์‹ ์— ์‚ฌ์šฉ์ž์˜ ์‹๋ณ„์ž์ธ Session ID๋ฅผ ์ €์žฅํ•œ๋‹ค.
์„œ๋ฒ„์—์„œ๋„ ์ธ์ฆ ์ •๋ณด์™€ ๋”๋ถˆ์–ด ํ•ด๋‹น Session ID์— ํ•ด๋‹นํ•˜๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋ณ„๋„๋กœ ์ €์žฅํ•˜์—ฌ ๊ด€๋ฆฌํ•œ๋‹ค.
์„œ๋ฒ„์˜ ๋ฉ”๋ชจ๋ฆฌ ๋˜๋Š” ๋กœ์ปฌ ํŒŒ์ผ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ข…๋ฃŒํ•˜๊ฑฐ๋‚˜, ์„œ๋ฒ„์—์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ ์„ธ์…˜์„ ์‚ญ์ œํ•˜์—ฌ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฟ ํ‚ค๋ณด๋‹ค ๋ณด์•ˆ์„ฑ์ด ์ข‹๋‹ค.
๋˜ํ•œ, ์ €์žฅ ๋ฐ์ดํ„ฐ์— ์ œํ•œ์ด ์—†๋‹ค๋ผ๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.

์„œ๋ฒ„์—์„œ ์„ธ์…˜์„ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์˜ ๋ถ€ํ•˜๊ฐ€ ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

์„ธ์…˜ ๋™์ž‘ ๋ฐฉ์‹

  • ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ๋กœ๊ทธ์ธ ์š”์ฒญ์— ๋Œ€ํ•ด ์‘๋‹ตํ•  ๋•Œ, ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋ณ„ Session ID๋ฅผ ๋ถ€์—ฌํ•œ๋‹ค.
  • Session ID๋ฅผ ๋‹ด์€ ์„ธ์…˜ ์ฟ ํ‚ค์™€ ํ•จ๊ป˜ Response๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ ์ธก ๋ธŒ๋ผ์šฐ์ €๋Š” ํ•ด๋‹น ์ฟ ํ‚ค๋ฅผ ์ฟ ํ‚ค ์ €์žฅ์†Œ์— ์ €์žฅํ•˜๊ณ  ๋‹ค๋ฅธ ์š”์ฒญ์„ ํ•  ๋•Œ๋งˆ๋‹ค ์ €์žฅ๋œ ์„ธ์…˜ ์ฟ ํ‚ค๋ฅผ Request Header์— ๋‹ด์•„์„œ ๋ณด๋‚ธ๋‹ค.
  • ์„œ๋ฒ„๋Š” ์ „๋‹ฌ๋ฐ›์€ ์ฟ ํ‚ค๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์„ธ์…˜ ID์—๋Š” ํŠน๋ณ„ํ•œ ๊ฐ’์ด ๋“ค์–ด์žˆ์ง€ ์•Š๊ณ , ์„œ๋ฒ„์—์„œ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ์„ธ์…˜ ID์˜ value์— ์‹๋ณ„ํ•  ์ˆ˜ ์ž‡๋Š” ๊ฐ’์ด ๋“ค์–ด์žˆ์œผ๋ฏ€๋กœ ์„ธ์…˜ ID๊ฐ€ ํƒˆ์ทจ๋‹นํ•˜๋”๋ผ๋„ ์ฟ ํ‚ค๋ณด๋‹ค๋Š” ์•ˆ์ „ํ•˜๋‹ค.

ํ•˜์ง€๋งŒ ์„ธ์…˜ ID๋ฅผ ํƒˆ์ทจ๋‹นํ•˜๋ฉด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋งˆ์Œ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•ด๋‹น ๋ถ€๋ถ„์€ ์„œ๋ฒ„์—์„œ IP๋ฅผ ํŠน์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ฟ ํ‚ค์™€ ์„ธ์…˜ ๋น„๊ต

 

 

3. ํ† ํฐ

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

ํ•˜์ง€๋งŒ, ์‹ค์งˆ์ ์œผ๋กœ ๋กœ๊ทธ์•„์›ƒ ์ฒ˜๋ฆฌ ๋“ฑ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Hybrid ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ผ๋ฐ˜์ ์ด๋‹ค.

 

ํ† ํฐ ๋™์ž‘ ๋ฐฉ์‹

  • ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ๋กœ๊ทธ์ธ ์š”์ฒญ์— ๋Œ€ํ•ด ์‘๋‹ตํ•  ๋•Œ, ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ํ† ํฐ์„ ๋ถ€์—ฌํ•œ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ํ† ํฐ์„ ์ €์žฅํ•ด ๋‘๊ณ , ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค Request Header์— ์ถ”๊ฐ€ํ•˜์—ฌ ์š”์ฒญํ•˜๋‹ค.
  • ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ํ† ํฐ์ด ์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•œ ํ† ํฐ์ธ์ง€ ๊ฒ€์ฆํ•œ๋‹ค.

 

ํ† ํฐ์˜ ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ์‹์—๋Š” JWT๊ฐ€ ์žˆ๋‹ค. JWT๋Š” ๋‹จ์ˆœ ์›น ํ† ํฐ(SWP) ๋ฐ SAML(Security Assertions Markup Language) ํ† ํฐ์— ๋น„ํ•ด ์—ฌ๋Ÿฌ ์ด์ ์ด ์žˆ๋‹ค.

  • More Compact : JSON์œผ๋กœ ์ธ์ฝ”๋”ฉ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, XML๋กœ ์ธ์ฝ”๋”ฉํ•˜๋Š” SAML ํ† ํฐ๋ณด๋‹ค ์ž‘๋‹ค.
  • More Secure: JWT๋Š” ๊ณต๊ฐœํ‚ค์™€ ๊ฐœ์ธํ‚ค๋ฅผ ๋‚˜๋ˆ„์–ด ์„œ๋ช…์ด ๊ฐ€๋Šฅํ•˜๋‹ค. HMAC ์•”ํ˜ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜์—ฌ ์•”ํ˜ธํ™”๋œ ์„œ๋ช…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • More Common: JSON์˜ object ๋ฐฉ์‹์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ ‘๊ทผ์„ฑ์ด ์ข‹๋‹ค.
  • Easier to process: JWT๋Š” ์ธํ„ฐ๋„ท ๊ทœ๋ชจ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋ฐ”์ผ์—์„œ ์ฒ˜๋ฆฌํ•  ๋•Œ๋„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

 

JWT ํ† ํฐ์˜ ๊ตฌ์กฐ

ํ† ํฐ์€ Header, Payload, Signature ์ด 3ํŒŒํŠธ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

 

Header - JWT

JWT์—์„œ ์‚ฌ์šฉํ•  ํƒ€์ž…๊ณผ ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ข…๋ฅ˜๊ฐ€ ๋“ค์–ด์žˆ๋‹ค. ์ฆ‰, ์–ด๋–ป๊ฒŒ ๊ฒ€์ฆํ•˜๋Š”๊ฐ€์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋‹ด๊ณ  ์žˆ๋‹ค.

alg๋Š” ์„œ๋ช… ์‹œ ์‚ฌ์šฉํ•˜๋Š” ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๊ณ , typ๋Š” ์„œ๋ช… ์‹œ ์‚ฌ์šฉํ•˜๋Š” ํ‚ค(public/private key)๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ฐ’์ด๋‹ค.

 

 

Payload - JWT

์„œ๋ฒ„์—์„œ ์ฒจ๋ถ€๋œ ์‚ฌ์šฉ์ž ๊ถŒํ•œ ์ •๋ณด์™€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊ฒจ์žˆ๋‹ค. Payload์— ์žˆ๋Š” ์†์„ฑ๋“ค์„ Claim Set์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.

Claim Set์€ JWT์— ๋Œ€ํ•œ ๋‚ด์šฉ(ํ† ํฐ ์ƒ์„ฑ์ž์˜ ์ •๋ณด, ์ƒ์„ฑ์ผ์‹œ ๋“ฑ)์ด๋‚˜ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„ ์ฃผ๊ณ ๋ฐ›๊ธฐ๋กœ ํ•œ ๋ฐ์ดํ„ฐ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

 

Signature - JWT

Header์™€ Payload๋ฅผ Base64 URL-safe Encode๋ฅผ ํ•œ ์ดํ›„ ํ•ด๋‹น ๋ฌธ์ž์—ด์„ ์ „์ž์„œ๋ช…ํ•œ ๊ฐ’์ด๋‹ค.
Header์— ๋ช…์‹œ๋œ ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋น„๋ฐ€ํ‚ค๋ฅผ ์ด์šฉํ•ด ์ „์ž์„œ๋ช…์„ ์ƒ์„ฑํ•œ๋‹ค. ๊ทธ ํ›„ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ•œ๋ฒˆ ๋” Base64 URL-safe Encode ํ•œ๋‹ค.

 

JWT ํ† ํฐ ์ธ์ฆ ๊ณผ์ •

  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ ๋กœ๊ทธ์ธ ์š”์ฒญํ•œ๋‹ค.
  2. ์•„์ด๋”” ํŒจ์Šค์›Œ๋“œ ์ผ์น˜ ์‹œ ์„œ๋ฒ„๋Š” Jwt Access Token๊ณผ Refresh Token์„ ๋ฐœ๊ธ‰ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.
  3. ํด๋ผ์ด์–ธํŠธ๋Š” ์•ก์„ธ์Šค ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„๋Š” ํ† ํฐ์— ์ด์ƒ์ด ์—†์œผ๋ฉด ์š”์ฒญํ•œ ์ •๋ณด๋ฅผ ์‘๋‹ตํ•œ๋‹ค.
  4. ๋งŒ์•ฝ ์•ก์„ธ์Šค ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋งŒ๋ฃŒ์‚ฌ์‹ค์„ ์•Œ๋ ค์ฃผ๊ณ , ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ์ด์šฉํ•˜์—ฌ ์•ก์„ธ์Šค ํ† ํฐ์„ ์žฌ๋ฐœ๊ธ‰ ๋ฐ›์•„ ์ƒˆ๋กœ ์ €์žฅํ•œ๋‹ค.

 

JWT ์žฅ์ 

  • Header์™€ Payload๋ฅผ ๊ฐ€์ง€๊ณ  Signature๋ฅผ ์ƒ์„ฑํ•จ์œผ๋กœ์จ ๋ฐ์ดํ„ฐ ์œ„๋ณ€์กฐ๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.
  • ์ธ์ฆ ์ •๋ณด์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ์ €์žฅ์†Œ๊ฐ€ ํ•„์š”์—†๋‹ค. (์‚ฌ์‹ค ์‹ค์ œ ์„œ๋น„์Šคํ•˜๋ ค๋ฉด ๋กœ๊ทธ์•„์›ƒ + ๋ฆฌํ”„๋ ˆ์Šคํ† ํฐ ์ €์žฅ์„ ์œ„ํ•ด ํ•„์š”ํ•˜๋‹ค..)
  • JWT๋Š” ์ž์ฒด์ ์œผ๋กœ ๊ธฐ๋ณธ ์ •๋ณด์™€ ์ „๋‹ฌํ•  ์ •๋ณด ๋ฐ ํ† ํฐ์ด ๊ฒ€์ฆ๋˜์—ˆ์Œ์„ ์ฆ๋ช…ํ•˜๋Š” ์ „์ž์„œ๋ช… ๋“ฑ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง„๋‹ค.
  • ํ™•์žฅ์„ฑ์ด ์šฐ์ˆ˜ํ•˜๋‹ค. Statelessํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ๋„ ๋ฌธ์ œ ์—†๋‹ค.
  • ๋ชจ๋ฐ”์ผ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. (์•ฑ์€ ์ฟ ํ‚ค์ €์žฅ์†Œ๊ฐ€ ์—†์Œ - Web View๊ฐ€ ์•„๋‹๋•Œ)

 

JWT ๋‹จ์ 

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

 

Sliding Sessions

๋ณด์•ˆ์„ฑ๊ณผ ํŽธ์˜์„ฑ์„ ๋ชจ๋‘ ์žก์„ ์ˆ˜ ์žˆ๋Š” ์ „๋žต์ด๋‹ค. ์ด ์ „๋žต์€ ์„ธ์…˜์„ ์ง€์†์ ์œผ๋กœ ์ด์šฉํ•˜๋Š” ์œ ์ €์—๊ฒŒ ์ž๋™์œผ๋กœ ๋งŒ๋ฃŒ ๊ธฐํ•œ์„ ๋Š˜๋ ค์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

๋งค ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ํ† ํฐ์„ ๋‚ด๋ ค์ฃผ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๊ธ€์„ ์ž‘์„ฑํ•˜๋‹ค๊ฐ€ ์ธ์ฆ์ด ๋งŒ๋ฃŒ๋˜๋Š” ๋ฌด์„œ์šด ๊ฒฝ์šฐ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ๊ธ€ ์ž‘์„ฑ์„ ์‹œ์ž‘ํ•  ๋•Œ ๋ฐœ๊ธ‰ํ•ด์ค€๋‹ค๊ฑฐ๋‚˜, ์‡ผํ•‘๋ชฐ์—์„œ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์•„ํ‹ฐ๋ฉ”์„ ๋‹ด๋Š” ๊ฒฝ์šฐ์— ๋ฐœ๊ธ‰ํ•ด์ฃผ๋Š” ๋“ฑ์˜ ์—ฌ๋Ÿฌ ์ „๋žต์„ ์„œ๋น„์Šค๋งˆ๋‹ค ์ •ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ† ํฐ์˜ ๋ฐœ๊ธ‰ ์‹œ๊ฐ„ (iat) ์†์„ฑ์„ ์ฐธ์กฐํ•ด์„œ ๊ฐฑ์‹  ์š”์ฒญ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.

 

Hybrid ํ† ํฐ ๋ฐฉ์‹

์‚ฌ์šฉ์ž์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š” Statelessํ•œ ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•  ๋•Œ๋Š” ๋ณด์•ˆ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

JWT๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ Access Token์™ธ์— Refresh Token์„ ๋„์ž…ํ•œ๋‹ค๊ฑฐ๋‚˜ Sliding Sessions ์ „๋žต์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ํ•ด๋‹น ๋ฐฉ์‹์„ ์ด์šฉํ•˜๋ ค๋ฉด ์ถ”๊ฐ€์ ์ธ ์ €์žฅ์†Œ๊ฐ€ ํ•„์š”ํ•˜๊ฒŒ ๋˜์–ด Statelessํ•˜๋‹ค๊ณ  ์ข‹์•„ํ–ˆ๋˜ ์žฅ์ ์€ ์—†์–ด์ง€๊ฒŒ ๋œ๋‹ค.

 

Refresh Token

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋กœ๊ทธ์ธ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์„œ๋ฒ„๋Š” Access Token๊ณผ ๊ทธ๋ณด๋‹ค ๋งŒ๋ฃŒ๊ธฐ๊ฐ„์ด ๊ธด Refresh Token์„ ํ•จ๊ป˜ ๋‚ด๋ ค์ค€๋‹ค.

์ฃผ๋กœ, Access Token์€ 30๋ถ„ ๋‚ด์™ธ ๊ทธ๋ฆฌ๊ณ  Refresh Token์€ 2์ฃผ์—์„œ ํ•œ๋‹ฌ ์ •๋„์˜ ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์„ ๋ถ€์—ฌํ•œ๋‹ค.

 

ํด๋ผ์ด์–ธํŠธ๋Š” Access Token์ด ๋งŒ๋ฃŒ๋˜์—ˆ๋‹ค๋Š” ์‘๋‹ต์„ ๋ฐ›๊ฒŒ ๋˜๋ฉด, Refresh Token์„ ์ด์šฉํ•˜์—ฌ Access Token์„ ์žฌ๋ฐœ๊ธ‰ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. 
์ด๋•Œ, Refresh Token๊นŒ์ง€ ๊ฐ™์ด ์žฌ๋ฐœ๊ธ‰ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
ํ˜น์—ฌ๋‚˜, Refresh Token ๊นŒ์ง€ ๋งŒ๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด ๋‹ค์‹œ ๋กœ๊ทธ์ธ์„ ํ•ด์•ผํ•œ๋‹ค.

 

Refresh Token์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ถ”๊ฐ€์ ์ธ ์ €์žฅ์†Œ์™€ I/O ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์˜๋ฏธ์ด๋ฉฐ, ์œ„์—์„œ ๋งํ–ˆ๋“ฏ ๊ธฐ์กด์˜ JWT ์žฅ์ ์„ ์‚ด๋ฆด ์ˆ˜๋Š” ์—†๋‹ค.  ๋˜ํ•œ, Refresh Token์„ ํƒˆ์ทจ๋˜๋ฉด ์•ˆ๋˜๋ฏ€๋กœ ํด๋ผ์ด์–ธํŠธ๋Š” ๋ณด์•ˆ์ด ์œ ์ง€๋˜๋Š” ๊ณต๊ฐ„์— ์ด๋ฅผ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค.

 

Refresh Token์€ ์„œ๋ฒ„์—์„œ ๋”ฐ๋กœ ์ €์žฅ์„ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ•์ œ๋กœ ํ† ํฐ์„ ๋งŒ๋ฃŒ์‹œํ‚ค๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

JWT์˜ ์‹œํฌ๋ฆฟ ํ‚ค

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

์‹œํฌ๋ฆฟ ํ‚ค์˜ ๊ฒฝ์šฐ ์ตœ์†Œ 512bits(์•ฝ 64๊ธ€์ž) ์ด์ƒ์˜ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

 

์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ HS256(HMAC with SHA-256)์„ ์‚ฌ์šฉํ•œ๋‹ค.
๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์‹œํฌ๋ฆฟ ํ‚ค๊ฐ€ ์•”/๋ณตํ˜ธํ™” ๋ชจ๋‘์— ์‚ฌ์šฉ๋œ๋‹ค. ํ•˜์ง€๋งŒ, ์•”/๋ณตํ˜ธํ™” ๋ชจ๋‘์— ์‹œํฌ๋ฆฟ ํ‚ค๊ฐ€ ์‚ฌ์šฉ๋˜๋‹ค๋ณด๋‹ˆ ํƒˆ์ทจ๋‹นํ–ˆ์„ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ๋น„๋Œ€์นญํ‚ค(๊ณต๊ฐœํ‚ค) ๋ฐฉ์‹๋ณด๋‹ค ์•ˆ์ „ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

 

๋”ฐ๋ผ์„œ, RS256๊ณผ ๊ฐ™์€ ๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์ด๋‹ค. ๊ณต๊ฐœํ‚ค๊ฐ€ ํƒˆ์ทจ๋˜์–ด๋„ ํ”„๋ผ์ด๋น— ํ‚ค๋ฅผ ๋ชจ๋ฅด๋ฉด ๊ณต๊ฒฉ์ž๋Š” ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋” ๋ฆฌ์†Œ์Šค๊ฐ€ ๋งŽ์ด ๋“ ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์œผ๋‹ˆ Trade off๋ฅผ ์ž˜ ์ƒ๊ฐํ•ด์„œ ์„ ํƒํ•˜๋ฉด ๋œ๋‹ค.