JWT

On a regular basisยท2021๋…„ 7์›” 19์ผ
0
post-thumbnail

๐ŸŸ ์ธ์ฆ๊ณผ ์ธ๊ฐ€ ๐ŸŸ

๐Ÿ• ์ธ์ฆ Authentication ๐Ÿ•

  • ๋กœ๊ทธ์ธ ์ ˆ์ฐจ์—์„œ ์ •ํ™•ํ•œ ์ด๋ฉ”์ผ/๋น„๋ฒˆ ์กฐํ•ฉ์„ ์ž…๋ ฅํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •
    ->๊ฒฐ๊ตญ ๐Ÿฅ‘ validํ•œ user์ธ๊ฐ€? ๐Ÿฅ‘
  • ์ธ์ฆ์€ ์™œ ํ•„์š”ํ•ด? ์šฐ๋ฆฌ ์„œ๋น„์Šค๋ฅผ ๋ˆ„๊ฐ€ ์“ฐ๋Š”์ง€? ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์ถ”์  ๊ฐ€๋Šฅํ•˜๋„๋ก!
  • ์ธ์ฆ์— ํ•„์š”ํ•œ ๊ฒƒ? ์•„์ด๋””, ์ด๋ฉ”์ผ์ฃผ์†Œ, ๋น„๋ฒˆ(์š”๊ฒŒ ๊ฐ€์žฅ ์ค‘์š”)
  • ๊ทธ๋Ÿผ ๋น„๋ฒˆ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ• ๊ฑด๋ฐ? ๐Ÿฅ‘ ์•”ํ˜ธํ™” ๐Ÿฅ‘ ์‹œ์ผœ์„œ!
  • ๊ทธ๋Ÿผ ์•”ํ˜ธํ™”๋Š” ์–ด๋–ป๊ฒŒ? db์— ์ €์žฅํ•  ๋•Œ ๊ฐœ์ธ์ •๋ณด๋ฅผ ๐Ÿฅ‘ ํ•ด์‹ฑ ๐Ÿฅ‘ ํ•ด์„œ ๋ณต์›ํ•  ์ˆ˜ ์—†๊ฒŒ!
  • ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™”๋ฅผ ํ•  ๋•Œ -> ๋‹จ๋ฐฉํ–ฅ ํ•ด์‰ฌ๋ฅผ ์”€!
  • ๋‹จ๋ฐฉํ–ฅ ํ•ด์‰ฌ? ๐Ÿฅ‘ ๋ณต์›์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๐Ÿฅ‘ ๋‹จ๋ฐฉํ–ฅ ํ•ด์‰ฌํ•จ์ˆ˜๋Š” ์•”ํ˜ธํ•™์  ์šฉ๋„๋กœ ์‚ฌ์šฉ. (ํ•ด์‰ฌํ…Œ์ด๋ธ” ex. python ๋”•์…”๋„ˆ๋ฆฌ)
  • ๋‹จ๋ฐฉํ–ฅ ํ•ด์‰ฌ ๋‹จ์ ?
    -> ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋ชจ๋‘ ํ•ด์‹œ๊ฐ’์œผ๋กœ ๋งŒ๋“ค์–ด์„œ ํŒ๋งคํ•˜๋Š” ์„œ๋น„์Šค ์กด์žฌ y
    ํ•ด์‰ฌ๊ฐ’์„ ์œ ์ถ”ํ•ด์ฃผ๋Š” ์‚ฌ์ดํŠธ๋„ ์กด์žฌ.. ์–ดํœด
  • ๋‹จ์ˆœ ํ•ด์‰ฌ๊ฐ’์ด ํ•ดํ‚น์— ์‰ฝ๊ฒŒ ๋…ธ์ถœ๋˜๋‹ˆ๊นŒ ๋ณด์™„์ฑ…์ด ํ•„์š”ํ•ด!
    -> ์ด๊ฑธ ๋ณด์™„ํ•˜๊ณ ์ž ์ž…๋ ฅํ•œ ๋น„๋ฒˆ + ๋ฌธ์ž์—ด(salt) ํ•ฉ์ณ์„œ ํ•ด์‹ฑํ•ด์„œ ์ด ํ•ด์‹œ๊ฐ’์„ ์ €์žฅ!
  • salting & keystretching ๋ง ๊ทธ๋Œ€๋กœ ์†Œ๊ธˆ์น˜๊ณ  ๋Š˜๋ฆฐ๋‹ค ๊ทธ๊ฒƒ๋„ ์—ฌ๋Ÿฌ๋ฒˆ !!!

๐Ÿ• Bcrypt ๐Ÿ•

  • Salting & KeyStretching ๋ฅผ ์‰ฝ๊ฒŒ ํ•ด์ฃผ๋Š” ๋Œ€ํ‘œ์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ๋‹ค์–‘ํ•œ ์–ธ์–ด ์ง€์›, ์‚ฌ์šฉํŽธํ•ด์„œ ์‰ฝ๊ฒŒ ์ ์šฉ ๊ฐ€๋Šฅ.

๐Ÿ• ์ธ๊ฐ€ Authorization ๐Ÿ•

  • ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ ๋ณด๋‚ด๋ฉด ์ธ์ฆ๊ณผ์ • ๊ฑฐ์ณ์„œ ๐Ÿฅ‘ ํ™•์ธ๋œ ์‚ฌ์šฉ์ž ๐Ÿฅ‘ ๊ฐ€ ๋งž๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •.
    (์ด๋ฏธ ๋กœ๊ธด ๋œ ์œ ์ €์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •!)
  • ์ž ๊น! HTTP์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํŠน์ง•?
    request / response ์š”์ฒญ๊ณผ ์‘๋‹ต
    statelessํ•œ ์„ฑ์งˆ(=์ €์žฅํ•˜์ง€ ์•Š๋Š” ์„ฑ์งˆ)
  • http๋Š” statelessํ•œ๋ฐ, ์„œ๋ฒ„์—์„œ ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•œ ์ƒํƒœ์ธ์ง€ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์ฐŒ?
    -> ๋งค http์š”์ฒญ๋งˆ๋‹ค ๐Ÿฅ‘ headers ๐Ÿฅ‘๋ฅผ ํ™œ์šฉํ•ด (authorization์ด๋ผ๋Š” key์— ๋‹ด์•„!) ์‚ฌ์šฉ์ž๊ฐ€ ๐Ÿฅ‘ ์ธ์ฆ์ ˆ์ฐจ๋ฅผ ๊ฑฐ์นœ ์‚ฌ์šฉ์ž ๐Ÿฅ‘ ์ž„์„ ์ฆ๋ช…ํ•˜๋Š” ์ •๋ณด๋ฅผ ๋‹ด์•„์„œ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•.

* ๊ทธ๋ ‡๋‹ค๋ฉด ์‹ค์ œ๋กœ ํ†ต์‹  ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€์ง€?

(๊ณผ๊ฑฐ) + ์ง€๊ธˆ๋„

		**client <--------------> server**
  • ํ”„๋ก ํŠธ์—์„œ http๋กœ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด server๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์˜ ์„ธ์…˜์— ์ €์žฅ, id๋ฅผ cookie์˜ ํ˜•ํƒœ๋กœ ๋‹ด์•„์„œ ๋ณด๋ƒ„.
  • client์—์„œ ๋ธŒ๋ผ์šฐ์ €์— ์ฟ ํ‚ค๋ฅผ ์ €์žฅ
  • ๋‹จ์ ? -> client ํ•˜๋‚˜, ์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์žˆ์œผ๋ฉด ๊ฐ์ž ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„๋ผ๋ฆฌ ๊ณต์œ ๊ฐ€ ์•ˆ๋จ.
    -> ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‹ค ๋”ฐ๋กœ ๊ด€๋ฆฌํ•ด์ฃผ์–ด์•ผํ•ด.

๐Ÿฅ‘ ๊ทธ๋ž˜์„œ json web token์ด๋ผ๋Š” ๊ฒŒ ๋‚˜ํƒ€๋‚จ.๐Ÿฅ‘

๐Ÿฅ‘ JWT (Json Web Token) ๐Ÿฅ‘

์ด๋ฉ”์ผ/๋น„๋ฒˆ์„ ๊ธฐ์ž…ํ•˜์—ฌ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐœํ–‰ํ•ด์ฃผ๋Š” ์ œ์ด์Šจ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ ํ‘œํ˜„ํ•œ ํ† ํฐ
1. ์ˆ˜๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ง€์›๋จ.
2. ์ž๊ฐ€ ์ˆ˜์šฉ์ ์ด๋‹ค.(ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์ž์ฒด์ ์œผ๋กœ ์ง€๋‹ˆ๊ณ  ์žˆ๋‹ค. ex. ํ† ํฐ ๊ธฐ๋ณธ์ •๋ณด, ์ „๋‹ฌํ•  ๋‚ด์šฉ, ์œ ์ €์ •๋ณด ๋“ฑ)
3. ๋‘ ๊ฐ์ฒด ์‚ฌ์ด์—์„œ ์‰ฝ๊ฒŒ ์ „๋‹ฌ ๋  ์ˆ˜ ์žˆ๋‹ค. (ex. http ํ—ค๋”์— ๋„ฃ์–ด์„œ ์ „๋‹ฌ ๊ฐ€๋Šฅ, url ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ ๊ฐ€๋Šฅ)

(ํ˜„์žฌ)

Json Web Token(JWT)

  • ํ—ค๋”(header): ํ† ํฐ์˜ ํƒ€์ž…๊ณผ ํ•ด์‹œ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐ
  • ๋‚ด์šฉ(payload): ๋งŒ๋ฃŒ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ณต๊ฐœ ๋ฐ์ดํ„ฐ, ์ˆจ๊ธธํ•„์š”๊ฐ€ ์—†๋Š” ๋ฐ์ดํ„ฐ(user-id ๋“ฑ)
  • ์„œ๋ช…(signature): jwt(string)๊ฐ€ ์›๋ณธ ๊ทธ๋Œ€๋กœ๋ผ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„
    (=๋‚ด๊ฐ€ ์ฒจ๋ณด๋‚ผ๋•Œ ๋ฐ์ดํ„ฐ๋ž‘ ๋‚ด๊ฐ€ ๋‚˜์ค‘์— ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ž‘ ๋งž๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ถ€๋ถ„)
  • ํ”„๋ก ํŠธ์—”๋“œ๊ฐ€ jwt๋ฅผ ๋ฐฑ์—”๋“œ api์„œ๋ฒ„๋กœ ์ „์†กํ•˜๋ฉด ์„œ๋ฒ„์—์„œ๋Š” ์ „์†ก๋ฐ›์€ jwt์˜ ์„œ๋ช…๋ถ€๋ถ„์„ ๋ณตํ˜ธํ™”ํ•˜์—ฌ ๋ฐฑ์—”๋“œ๊ฐ€ ์ฒ˜์Œ์— ์„œ๋ฒ„์—์„œ ์ƒ์„ฑํ•œ jwt๊ฐ€ ๋งž๋Š”์ง€ ํ™•์ธ

๐Ÿ• JWT๋ฅผ ํ™œ์šฉํ•œ๋‹ค๋ฉด? ๐Ÿ•


1. client๊ฐ€ ์„œ๋ฒ„์— http์š”์ฒญ(๋กœ๊ทธ์ธ)ํ•˜๋ฉด,
2. ์œ ์ €์ •๋ณด ํ™•์ธ ํ›„ ์„œ๋ฒ„์˜ secret key(my_settings.py)๋ฅผ ํ™œ์šฉํ•ด jwt๋ฅผ ์ƒ์„ฑ ๋ฐ jwt๋ฅผ ํ”„๋ก ํŠธ์— ๋ณด๋ƒ„
3. ํ”„๋ก ํŠธ์—์„œ jwt๋ฅผ ๋ธŒ๋ผ์šฐ์ €(๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€)์— ์ €์žฅํ•˜๊ณ 
4. jwt๋ฅผ ํฌํ•จํ•œ http๋ฅผ ์š”์ฒญ(ํ—ค๋”์— ๋‹ด์•„์„œ!) ๋ฐฑ์—๊ฒŒ~!
5. ๋ฐฑ์—์„œ jwt์˜ signature ๋ถ€๋ถ„์„ ํ™•์ธ ํ›„, ํ•ด๋‹น ์œ ์ €์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค! ํ™•์ธ ํ›„ ์œ ์ €์˜ ์ •๋ณด๊ฐ€ ์ผ์น˜ํ•˜๋ฉด!!
7. payload๋ถ€๋ถ„์— ๋‹ด์•„์„œ http ์‘๋‹ต! ์™„๋ฃŒ~!

* ๊ทธ๋Ÿผ ์•„๊นŒ์˜ ๋‹จ์  ํ•ด๊ฒฐ ์–ด๋–ป๊ฒŒ?
-> ์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ. ๊ฐ ํ•ด๋‹น ์„œ๋ฒ„์—์„œ ๋˜‘๊ฐ™์€ secret key๋ฅผ ๊ณต์œ ํ•˜๋ฉด๋จ -> ๊ทธ๋Ÿผ ๊ณ„์† ๋˜‘๊ฐ™์€ ๊ฐ’์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๊ฑฐ๋‹ˆ๊นŒ!

๐Ÿ† JWT ์žฅ์ ?
JWT์˜ ๋„“์€ ๋ฒ”์šฉ์„ฑ, ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ, ํ•„์š”ํ•œ ๊ฐ’์„ ์ž์ฒด ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ์„ฑ์งˆ ๋•Œ๋ฌธ์— ๋งŽ์€ ๊ณณ์—์„œ JWT๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ , ์•ž์œผ๋กœ ๋” ๋งŽ์€ ๊ณณ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ํŠนํžˆ MSA์—์„œ ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹  ์‹œ ๊ถŒํ•œ ์„œ๋น„์Šค์™€์˜ ์˜์กด์„ฑ์„ ์ค„์ผ ์ˆ˜ ์žˆ์–ด ์„œ๋ฒ„์™€ ์„œ๋ฒ„ ๊ฐ„ ํ†ต์‹ ์— ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค.

๐Ÿ† JWT ๋‹จ์ ?
๋‹จ์ ์œผ๋กœ๋Š” ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ๊ถŒํ•œ์ด๋‚˜ ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ JWT๋ฅผ ์ƒˆ๋กœ ๋ฐœ๊ธ‰ํ•ด์•ผ ํ•˜๋ฉฐ, ๊ฒฝ์šฐ์— ๋”ฐ๋ผ JWT์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ ์ˆ˜ ์žˆ๋‹ค. JWT์˜ ํ—ค๋”๋‚˜ ํŽ˜์ด๋กœ๋“œ๋Š” ๋””์ฝ”๋”ฉ(Decoding)ํ•˜๋ฉด ๋ฐ”๋กœ ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— JWT์˜ ๋ชจ๋“  ๊ฐ’๋“ค์€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๊ณต๊ฐœ๋œ๋‹ค. ์™ธ๋ถ€์— ๋…ธ์ถœ๋˜์–ด์„œ๋Š” ์•ˆ๋˜๊ฑฐ๋‚˜ ๋ฏผ๊ฐํ•œ ๊ฐ’์ด ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ์–ด ๋ณด์•ˆ ๋ฌธ์ œ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ๋‹ด์ ์ด ์žˆ๋‹ค.

๐Ÿ” JWT ์–ด๋ ต๋‹น... ํœด ๐Ÿ”

profile
๊ฐœ๋ฐœ ๊ธฐ๋ก

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

comment-user-thumbnail
2021๋…„ 7์›” 26์ผ

๋„ˆ๋ฌด ๊นœ์ฐํ•œ ์ •๋ฆฌ

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ