๐Ÿ“ฑCS | JWT๋ž€?

dayannneยท2023๋…„ 11์›” 8์ผ
0
post-thumbnail

๐Ÿช™ํ† ํฐ์ด๋ž€?

๋ฒ„์Šคํƒˆ ๋•Œ ๋‚ด๋˜ ๋™์ „, ๋‚ด๊ฐ€ ์ด ๋ฒ„์Šค๋ฅผ ํƒˆ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ด๋ผ๋Š” ์ž๊ฒฉ์„ ์ฆ๋ช…ํ•˜๋Š” ์ˆ˜๋‹จ

- ๊ธฐ์ˆ ์  ์“ธ๋ชจ

๊ถŒํ•œ์„ ์ฃผ๊ธฐ ์œ„ํ•ด์„œ, ์‹ ์› ์ฆ๋ช…


๋กœ๊ทธ์ธ๊ณผ ํ† ํฐ

๋กœ๊ทธ์ธ์— ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

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

ํ† ํฐ ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ ๊ณผ์ •

  1. (ํด๋ผ์ด์–ธํŠธ -> ์„œ๋น„์Šค) ๋กœ๊ทธ์ธ ์š”์ฒญ
  2. (์„œ๋น„์Šค -> ํด๋ผ์ด์–ธํŠธ) ํ† ํฐ ๋ฐœ๊ธ‰ ๋ฐ ์ „๋‹ฌ
  3. (ํด๋ผ์ด์–ธํŠธ) ํ† ํฐ ๋ณด๊ด€
  4. (ํด๋ผ์ด์–ธํŠธ) ํ† ํฐ์„ ์‚ฌ์šฉํ•ด ์š”์ฒญ

์‹ค์ œ ์„œ๋น„์Šค์—์„œ์˜ ๊ตฌ์กฐ

  • ํŽ˜์ด์ง€์— ์ €์žฅ๋œ ํ† ํฐ์ด ์žˆ๋Š”์ง€ ํ™•์ธ ์ฟ ํ‚ค, ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€, ๋กœ์ปฌ ๋“ฑ๋“ฑ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ํ† ํฐ์ด ์žˆ์œผ๋ฉด ์•„์ง ์“ธ ์ˆ˜ ์žˆ๋Š”์ง€ ์„œ๋ฒ„์— ๋ณด๋‚ด ํ† ํฐ ์œ ํšจ์„ฑ ๊ฒ€์ฆ์„ ํ•œ๋‹ค. (๋ณดํ†ต ํ† ํฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋Š” ์ง์ ‘ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ  ์„œ๋ฒ„์— ์š”์ฒญํ•˜๋ฉด ๋œ๋‹ค) ๐Ÿง axios๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ ์š”์ฒญ์ „์— ํ† ํฐ ๊ฒ€์‚ฌ๋ฅผ ํ•˜๊ณ  ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ํ†ตํ•ด ์žฌ๋ฐœ๊ธ‰ํ•˜๊ณ  ๊ธฐ์กด์˜ ์š”์ฒญ์„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด ๋œ๋‹ค.
  • ๋งŒ์•ฝ ์„œ๋ฒ„์—์„œ ๋ชป์“ด๋‹ค๊ณ  ํ•˜๋ฉด ๋กœ๊ทธ์ธ์„ ๋‹ค์‹œ ์ง„ํ–‰ํ•˜๊ณ , ์„œ๋ฒ„์— ์ธ์ฆ์ •๋ณด(id/pw)๋ฅผ ๋ณด๋‚ธ ํ›„ ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ ์„œ๋ฒ„์—์„œ ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•œ๋‹ค. (์• ์ดˆ์— ํ† ํฐ์ด ์—†์œผ๋ฉด ๋กœ๊ทธ์ธ๋ถ€ํ„ฐ ์ง„ํ–‰ํ•œ๋‹ค)
  • ๋กœ๊ทธ์ธ ์„ฑ๊ณต ํ›„ ํ† ํฐ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

JWT

๐Ÿง JSON Web Token

ํ† ํฐ์„ ๋งŒ๋“œ๋Š” ๊ธฐ์ˆ ์˜ ์ด๋ฆ„์ด๋ฉด์„œ ์ด ๊ธฐ์ˆ ๋กœ ๋งŒ๋“ค์–ด์ง„ ํ† ํฐ์„ JWT๋ผ๊ณ  ํ•œ๋‹ค.

์™ผ์ชฝ Encoded๋œ ๋ฌธ์ž๊ฐ€ JWT ํ† ํฐ์˜ ํ˜•ํƒœ๋กœ,
Decodeํ•˜๋ฉด ์˜ค๋ฅธ์ชฝ๊ณผ ๊ฐ™์ด Header, Payload, Signature๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค.

1) Header

  • ์•”ํ˜ธํ™” ๊ทœ์น™ - ์•”ํ˜ธํ™”๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ๊ทœ์น™
  • ํ† ํฐํƒ€์ž…
  • ์˜คํ”ˆ๋œ ๋ฐ์ดํ„ฐ ์„œ๋ฒ„์— ์žˆ๋‹ค

Payload

  • ๋ฐ์ดํ„ฐ(ํด๋ ˆ์ž„)
  • ๋ˆ„๊ฐ€, ์–ธ์ œ, ์–ด๋–ป๊ฒŒ
  • iat - ์–ธ์ œ ๋ฐœ๊ธ‰๋˜์—ˆ๋Š”์ง€์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ์กฐ๊ฐ
  • ์˜คํ”ˆ๋œ ๋ฐ์ดํ„ฐ ์„œ๋ฒ„์— ์žˆ๋‹ค

Signature

  • ์•”ํ˜ธํ™”๋ฅผ ์œ„ํ•œ ๋ฐ์ดํ„ฐ
  • ํ† ํฐ์šฉ ์•”ํ˜ธ์™€ ํ‚ค๋ฅผ ๋„ฃ์–ด์„œ ํ•ด์‹ฑํ•œ๋‹ค.

โ†’ Header + Payload + '์‹œํฌ๋ฆฟ ํ‚ค' =Signature
์œ ์ €๊ฐ€ ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•˜๋ฉด (์˜ฌ๋ฐ”๋ฅธ ์œ ์ € ์ •๋ณด๊ฐ€ ์ „๋‹ฌ๋˜์—ˆ์„ ๋•Œ) ์„œ๋ฒ„์—์„œ Signature๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋‚ด๋ ค์ค€๋‹ค. (ํด๋ผ์ด์–ธํŠธ์—์„œ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ ์•„๋‹˜!)
์„œ๋ฒ„์—์„œ ํ•ด๋‹น JWT๊ฐ€ ์œ ํšจํ•œ ๊ฒƒ์ธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•จ์œผ๋กœ,
ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฌด์—‡์„ ๋„ฃ์–ด์„œ ์•”ํ˜ธ๊ฐ’์ด ๋˜์—ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค.
์„œ๋ฒ„๋Š” ์ž์‹ ์ด ์•Œ๊ณ  ์žˆ๋Š” ์‹œํฌ๋ฆฟ ํ‚ค๋ž‘ ๊ฐ™์ด ํ•ฉ์ณ์„œ ๋‹ค์‹œ ํ•ด์‹ฑ์„ ํ•˜์—ฌ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿง ์„œ๋ฒ„์—์„œ๋Š” ์•”ํ˜ธํ™” ๋˜์ง€ ์•Š์€ secret key๊ฐ€ ์žˆ๊ณ , signature์—์„œ๋Š” ์•”ํ˜ธํ™” ๋œ secret key๊ฐ€ ์žˆ๋‹ค.

๐Ÿง ํ•ด์‹ฑ์ด๋ž€?
๋’ค๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์—†๋Š” ์•”ํ˜ธํ™” ๊ธฐ๋ฒ•, ์ฆ‰ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
๋ณตํ˜ธํ™”(ํ‘ธ๋Š” ๊ฒƒ)๋ฅผ ํ•  ์ˆ˜ ์—†๋‹ค.

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

stateless token ์‚ฌ์šฉ ์ด์œ 

  • ํ† ํฐ ์ž์ฒด๊ฐ€ ์Šค์Šค๋กœ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆํ•˜๋Š” ์™„๊ฒฐ์„ฑ์„ ๊ฐ€์ง„๋‹ค. (ํ† ํฐ ์œ ํšจ ๊ธฐ๊ฐ„๊นŒ์ง€๋„ ๊ฒ€์ฆ)
  • ์„œ๋ฒ„์—์„œ๋Š” ๋งค๋ฒˆ ํ™•์ธํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ๋•Œ๋งŒ ์œ ํšจ์„ฑ์„ ์•Œ๋ ค์ฃผ๋ฉด ๋˜๊ธฐ์— ์„œ๋ฒ„์˜ ๋ถ€๋‹ด์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

JWT ๋ณด๊ด€ ๋ฐฉ์‹๊ณผ ๋ณด์•ˆ

๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์˜ ๋ฌธ์ œ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋งค์šฐ ์‰ฝ๊ฒŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋ฌธ์ œ
XSS๋ผ๋Š” ๊ณต๊ฒฉ Script๋ฅผ ํ†ตํ•œ ํ•ดํ‚น์˜ ์œ„ํ—˜์ด ์žˆ๋‹ค.

์ฟ ํ‚ค์˜ ๋ฌธ์ œ

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

  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• : CSRF -> httpOnly true ์„ค์ •์œผ๋กœ ๋ฐฉ์–ด
    httpOnly true ์„ค์ •์„ ํ•ด๋‘๋ฉด JS์—์„œ๋Š” httpOnly ์„ค์ •์„ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์•…์„ฑ์‚ฌ์ดํŠธ์—์„œ JS๋กœ ์ ‘๊ทผํ•˜๋ ค๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค
profile
โ˜๏ธ

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

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด