๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋ณด์•ˆ

์ฟ ํ‚ค-์„ธ์…˜, JWT ํ† ํฐ ์ธ์ฆ

์ฟ ํ‚ค-์„ธ์…˜, JWT ํ† ํฐ ์ธ์ฆ

์ฟ ํ‚ค-์„ธ์…˜ ์ธ์ฆ๊ณผ JWT ํ† ํฐ ์ธ์ฆ์„ ์•Œ์•„๋ณด์ž.

์ฟ ํ‚ค-์„ธ์…˜ ์ธ์ฆ

HTTP ํ”„๋กœํ† ์ฝœ์˜ Stateless

HTTP ํ”„๋กœํ† ์ฝœ์€ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ๋ชจ๋“  ์—ฐ๊ฒฐ์„ ์ €์žฅํ•ด๋‘๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ, ์„œ๋ฒ„์˜ ๋ถ„์‚ฐ ๋“ฑ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ Stateless(๋น„์—ฐ๊ฒฐ์„ฑ, ๋ฌด์ƒํƒœ) ์ƒํƒœ์ด๋‹ค.

์ด Stateless ์ƒํƒœ์—์„œ ์ธ์ฆ๋œ ํด๋ผ์ด์–ธํŠธ์ž„์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ทธ ์ •๋ณด๋ฅผ ์ฟ ํ‚ค์™€ ์„ธ์…˜์— ์ €์žฅํ•ด์•ผ ๋œ๋‹ค.

์ฟ ํ‚ค-์„ธ์…˜ ์ธ์ฆ์˜ ๊ณผ์ •

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ID์™€ Password๋ฅผ ์„œ๋ฒ„์—๊ฒŒ ๋ณด๋‚ด์ค€๋‹ค.
    • ํด๋ผ์ด์–ธํŠธ ---(ID, PW)--> ์„œ๋ฒ„
  • ์„œ๋ฒ„๋Š” ํ•ด๋‹น ์ •๋ณด๋ฅผ DB์—์„œ ์กฐํšŒํ•˜๊ณ  ์ •ํ™•ํ•œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ผ๋ฉด ์„œ๋ฒ„์˜ Session์— ์ธ์ฆํ•œ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•˜๊ณ  sessionID๋ฅผ ์ฟ ํ‚ค๋กœ ๋ฐœ๊ธ‰ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.
    • ํด๋ผ์ด์–ธํŠธ <--(sessinID)-- ์„œ๋ฒ„
  • ์ฟ ํ‚ค๋Š” ๋ฐœ๊ธ‰๋ฐ›์€ sessionID๋ฅผ ์„œ๋ฒ„์—๊ฒŒ ๋ณด๋‚ด ๋กœ๊ทธ์ธ ํ•œ ์‚ฌ์šฉ์ž์ž„์„ ์ธ์ฆํ•œ๋‹ค.
    • ํด๋ผ์ด์–ธํŠธ --(sessinID)--> ์„œ๋ฒ„ (์ธ์ฆ ์™„๋ฃŒ)

์ฟ ํ‚ค-์„ธ์…˜ ์ธ์ฆ์˜ ๋‹จ์ 

  • ๋ณ„๋„์˜ ์ €์žฅ ๊ณต๊ฐ„์ด ํ•„์š”
  • ํƒˆ์ทจ ๋‹นํ•˜๋ฉด ์•…์˜์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

๋‘ ๋‹จ์ ์„ ๋’ค์ง‘๊ธฐ ์œ„ํ•ด์„œ JWT ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์บ์‹œ vs ์ฟ ํ‚ค

  • ๊ณตํ†ต์ ์€ ๋‘˜ ๋‹ค ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ์„œ๋น„์Šค
  • ์บ์‹œ : ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์ •๋ณด (์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅ๋จ)
  • ์ฟ ํ‚ค : ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์ด ์ •ํ•ด์ ธ์žˆ๊ณ  ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„ ์ดํ›„ ์‚ญ์ œ๋œ๋‹ค.

JWT ํ† ํฐ

์ฟ ํ‚ค-์„ธ์…˜ ์ธ์ฆ์˜ ๋‹จ์ ์„ ๋’ค์ง‘๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”

-> JWT ํ† ํฐ(Json Web Token)์„ ๋ฐœ๊ธ‰ํ•œ๋‹ค.

JWT ํ† ํฐ์˜ ๊ตฌ์„ฑ ์š”์†Œ

  • header : ํ† ํฐ ํƒ€์ž…, ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹
  • payLoad : ํšŒ์›์ •๋ณด๋‚˜ ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์€ ์ •๋ณด (๋””์ฝ”๋”ฉ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ๋„ฃ์ง€ ์•Š๋Š”๋‹ค.)
    • iat(๋ฐœ๊ธ‰ ์‹œ๊ฐ„), exp(๋งŒ๋ฃŒ์‹œ๊ฐ„) -> ๊ณ„์ • ๊ด€๋ จ ์ •๋ณด๋Š” ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์ด ์žˆ๋‹ค.
  • signature(์„œ๋ช…) : ํŠน์ • ์„œ๋ฒ„์—์„œ ๋ฐœ๊ธ‰ํ–ˆ๋‹ค๋Š” ์„œ๋ช… (์„œ๋ฒ„๊ฐ€ ๋ฐœ๊ธ‰ํ•œ ์•”ํ˜ธํ™”์— ๋“ค์–ด๊ฐ€๋Š” ํ‚ค๊ฐ€ ์žˆ์Œ)

signature์— ์‚ฌ์šฉ๋˜๋Š” ๋น„๋ฐ€ํ‚ค๊ฐ€ ํƒˆ์ทจ๋‹นํ•˜๋ฉด JWT ํ† ํฐ ์ธ์ฆ๋„ ์œ„ํ—˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— https ํ”„๋กœํ† ์ฝœ๋กœ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

JWT ์˜ˆ์‹œ

(์ถœ์ฒ˜ : https://jwt.io)

{HEADER๋ฅผ base64UrlEncode}.{PAYLOAD๋ฅผ base64UrlEncode}.

{ {HEADER๋ฅผ base64UrlEncode} + "." + {PAYLOAD๋ฅผ base64UrlEncode} +์•”ํ˜ธ ํ‚ค}๋ฅผ HMACSHA256 ๋ฐฉ์‹์œผ๋กœ ์•”ํ˜ธํ™”ํ•œ ๊ฐ’}

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

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ID์™€ Password๋ฅผ ์„œ๋ฒ„์—๊ฒŒ ๋ณด๋‚ด์ค€๋‹ค.
    • ํด๋ผ์ด์–ธํŠธ ---(ID, PW)--> ์„œ๋ฒ„
  • ์„œ๋ฒ„๊ฐ€ JWT ํ† ํฐ์„ ๋ฐœ๊ธ‰( ํด๋ผ์ด์–ธํŠธ๋งŒ ๋”ฐ๋กœ ์ €์žฅ, ์„œ๋ฒ„๋Š” ๋”ฐ๋กœ ์ €์žฅ X)
    • ํด๋ผ์ด์–ธํŠธ <--(JWT ํ† ํฐ)-- ์„œ๋ฒ„
  • ์ดํ›„ ๋กœ๊ทธ์ธ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ—ค๋”์— JWT ํ† ํฐ์„ ๋ณด๋ƒ„
    • ํด๋ผ์ด์–ธํŠธ ---(JWT ํ† ํฐ)--> ์„œ๋ฒ„
  • ์„œ๋ฒ„์—์„  ๊ทธ JWT ํ† ํฐ์„ ํ™•์ธํ•ด์„œ ์ธ์ฆ์„ ํ™•์ธํ•œ๋‹ค.
    • signature๋ฅผ ํ™•์ธํ•˜์—ฌ ๋ณธ ์„œ๋ฒ„์—์„œ ๋ฐœ๊ธ‰ํ•ด ์ค€ JWT ์ธ์ง€ ํ™•์ธ ํ›„ header์™€ payLoad์„ ๋””์ฝ”๋”ฉํ•จ.
      • header์™€ payLoad๋ฅผ ์ธ์ฝ”๋”ฉํ•œ ๊ฐ’๊ณผ ์„œ๋ฒ„์˜ ๋น„๋ฐ€ํ‚ค๋ฅผ ํ—ค๋”์— ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ์•”ํ˜ธํ™”ํ•œ ํ›„ signature์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

์ธ์ฝ”๋”ฉ : ๋ณตํ˜ธํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹, ์•”ํ˜ธํ™” : ๋ณตํ˜ธํ™” ํ•  ์ˆ˜ ์—†๋Š” ๋ฐฉ์‹ (์ธ์ฝ”๋”ฉ != ์•”ํ˜ธํ™”)

'๋ณด์•ˆ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Bcrypt ์ธ์ฝ”๋”ฉ  (0) 2022.03.15
์•”ํ˜ธํ™” ํ•ด์‹œ ํ•จ์ˆ˜  (0) 2022.03.13
A5/1 แ„€แ…ฎแ„’แ…งแ†ซ(C++)  (0) 2022.03.13