Skip to content

Latest commit

ย 

History

History
445 lines (280 loc) ยท 21.5 KB

CookieSessionJWT.md

File metadata and controls

445 lines (280 loc) ยท 21.5 KB

์ฟ ํ‚ค, ์„ธ์…˜, ํ† ํฐ

์ธ์ฆ์˜ ํ•„์š”์„ฑ
์ธ์ฆ ๋ฐฉ์‹
์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ์ธ์ฆ (์ฟ ํ‚ค & ์„ธ์…˜)
ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ (JWT ํ† ํฐ)

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

HTTP ํ”„๋กœํ† ์ฝœ์€ ๋น„์—ฐ๊ฒฐ์„ฑ, ๋ฌด์ƒํƒœ์„ฑ ํ”„๋กœํ† ์ฝœ์ด๋‹ค.

  1. HTTP ํ”„๋กœํ† ์ฝœ์€ ๋น„์—ฐ๊ฒฐ์„ฑ(Connectionless) ํ”„๋กœํ† ์ฝœ์ด๋‹ค.

    ํด๋ผ์ด์–ธํŠธ๊ฐ€ request๋ฅผ ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„๋Š” ์ด์— ๋Œ€ํ•œ response๋ฅผ ๋ณด๋‚ด๋ฉด ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง„๋‹ค.

  2. HTTP ํ”„๋กœํ† ์ฝœ์€ ๋ฌด์ƒํƒœ์„ฑ(Stateless) ํ”„๋กœํ† ์ฝœ์ด๋‹ค

    ์œ„์ฒ˜๋Ÿผ response, request๋ฅผ ์ฃผ๊ณ  ๋ฐ›์€ ๋’ค, ์ƒํƒœ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š์€ ์ฑ„ ํ†ต์‹ ์ด ๋๋‚œ๋‹ค.


์ธ์ฆ์˜ ํ•„์š”์„ฑ โ†’ ์ฟ ํ‚ค, ์„ธ์…˜, ํ† ํฐ์˜ ํ•„์š”์„ฑ

HTTP๋Š” ์„œ๋ฒ„๊ฐ€ ๋‹ค์ˆ˜์˜ ํด๋ผ์ด์–ธํŠธ์™€ ์—ฐ๊ฒฐ์„ ๊ณ„์† ์œ ์ง€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ์ž์› ๋‚ญ๋น„๋ฅผ ์ค„์ผ์ˆ˜ ์žˆ์ง€๋งŒ ๋™์‹œ์— ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์—†๋‹ค.

๋งŒ์•ฝ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋กœ๊ทธ์ธ์„ ํ•˜๋”๋ผ๋„ ๋‹ค์Œ ์š”์ฒญ์‹œ ํ•ด๋‹น ํด๋ผ์ด์–ธํŠธ์˜ ์ธ์ฆ ์ •๋ณด๋ฅผ ๊ธฐ์–ตํ•˜์ง€ ๋ชปํ•œ๋‹ค๋ฉด ๋‹ค์‹œ ๋กœ๊ทธ์ธํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋งค๋ฒˆ ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„๋Š” ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž๋กœ ์ธ์‹ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ์ฆ ์ ˆ์ฐจ๊ฐ€ ์ค‘๋ณต๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

HTTP์˜ ๋ฌด์ƒํƒœ์„ฑ์œผ๋กœ ์ธํ•ด ์ธ์ฆ์ ˆ์ฐจ๊ฐ€ ์ค‘๋ณต๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ฟ ํ‚ค, ์„ธ์…˜, ํ† ํฐ ์œผ๋กœ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.


์ธ์ฆ ๋ฐฉ์‹

  1. HTTP ๊ธฐ๋ณธ ์ธ์ฆ

    ๊ฐ€์žฅ ์ž˜ ์•Œ๋ ค์ง„ HTTP ์ธ์ฆ ๊ทœ์•ฝ์œผ๋กœ, ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ Base64 ์ธ์ฝ”๋”ฉํ•˜์—ฌ Header์— ๋‹ด์•„ ์ „์†กํ•˜๋Š” ์ธ์ฆ ๋ฐฉ์‹์ด๋‹ค. ์ด ๋ฐฉ์‹์€ request์„ ๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค ์‚ฌ์šฉ์ž์˜ ๊ณ„์ • ์ •๋ณด๋ฅผ Header์— ๋‹ด์•„ ์ „์†กํ•˜๋ฏ€๋กœ ๋ณด์•ˆ์— ์ทจ์•ฝํ•˜๋‹ค

    Base64 ์ธ์ฝ”๋”ฉ์ด๋ž€ Base64๋ž€ Binary Data๋ฅผ Text๋กœ ๋ฐ”๊พธ๋Š” Encoding(binary-to-text encoding schemes)์˜ ํ•˜๋‚˜๋กœ์จ Binary Data๋ฅผ Character set์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š” ๊ณตํ†ต ASCII ์˜์—ญ์˜ ๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พธ๋Š” Encoding์ด๋‹ค.
  2. ์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ์ธ์ฆ

    ์„œ๋ฒ„์˜ ์„ธ์…˜๊ณผ ํด๋ผ์ด์–ธํŠธ์˜ ์ฟ ํ‚ค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ธ์ฆ ๋ฐฉ์‹์ด๋‹ค.

  3. ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ

    ํด๋ผ์ด์–ธํŠธ์˜ ์„ธ์…˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ , ํ•„์š”ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์žˆ๋Š” ํ† ํฐ์„ ํ™œ์šฉํ•˜๋Š” ์ธ์ฆ ๋ฐฉ์‹์ด๋‹ค.

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

์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ์ธ์ฆ(์ฟ ํ‚ค & ์„ธ์…˜)

## ์ฟ ํ‚ค๋ž€

์ฟ ํ‚ค๋ž€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์–ด๋– ํ•œ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•  ๊ฒฝ์šฐ, ๊ทธ ์‚ฌ์ดํŠธ๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์˜ ๋ธŒ๋ผ์šฐ์ €์— ์„ค์น˜๋˜๋Š” key-value ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด์ด๋‹ค.

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

99F0CA485B96889D17.png


์ฟ ํ‚ค์˜ ์†์„ฑ๊ณผ ์ข…๋ฅ˜

์ฟ ํ‚ค์˜ ์†์„ฑ

Untitled

Name ์ฟ ํ‚ค์˜ ์ด๋ฆ„
Value ์ฟ ํ‚ค ๊ฐ’
Domain ์ฟ ํ‚ค์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๋„๋ฉ”์ธ์„ ์„ค์ •ํ•˜๋Š” ์†์„ฑ์ด๋‹ค.
- domain=google.com ์œผ๋กœ ๋„๋ฉ”์ธ์„ ์„ค์ •ํ•˜๋ฉด *.google,com ๊ณผ ๊ฐ™์€ ์„œ๋ธŒ ๋„๋ฉ”์ธ์—์„œ ํ•ด๋‹น ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
- ๋„๋ฉ”์ธ์„ ์„ค์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์„œ๋ธŒ๋„๋ฉ”์ธ์—์„œ ํ•ด๋‹น ์ฟ ํ‚ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค
Path ์ฟ ํ‚ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•˜๋Š” ์†์„ฑ์ด๋‹ค.
- path=/cat ์œผ๋กœ path๋ฅผ ์„ค์ •ํ•˜๋ฉด /cat , /cat/1 , /cat/1/age ์™€ ๊ฐ™์€ ๊ฒฝ๋กœ์—์„œ ํ•ด๋‹น ์ฟ ํ‚ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค
Expires/Max-Age Expires/Max-Age๋Š” ์ฟ ํ‚ค๋ฅผ ์–ผ๋งˆ๋‚˜ ์œ ์ง€ํ•  ๊ฒƒ์ธ์ง€ ์„ค์ •ํ•˜๋Š” ์†์„ฑ์ด๋‹ค.
- Expires/Max-Age๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์€ ์ฟ ํ‚ค๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ซํž๋•Œ ์‚ญ์ œ๋œ๋‹ค. (์ด์™€ ๊ฐ™์€ ์ฟ ํ‚ค๋ฅผ ์„ธ์…˜ ์ฟ ํ‚ค ๋ผ ํ•œ๋‹ค)
HttpOnly ํด๋ผ์ด์–ธํŠธ์—์„œ Javascript์˜ document,cookie ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ฟ ํ‚ค๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์—†๋„๋ก ์„ ์–ธํ•˜๋Š” ์„ค์ •์ด๋‹ค.
- XSS (Cross-site Scripting) ๊ณต๊ฒฉ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. (XXS : ์›น ์‚ฌ์ดํŠธ ๊ด€๋ฆฌ์ž๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์ด๊ฐ€ ์›น ํŽ˜์ด์ง€์— ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ์ทจ์•ฝ์ ์ด๋‹ค)
- XSS๋Š” ์„œ๋ฒ„๋ฅผ ์ด์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๊ณต๊ฒฉ์„ ๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
Secure Secure ์†์„ฑ์„ ์„ค์ •ํ•˜๋ฉด ํ•ด๋‹น ์ฟ ํ‚ค๋Š” HTTPS ํ†ต์‹ ์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค
SameSite ์‚ฌ์ดํŠธ ์™ธ๋ถ€์—์„œ์˜ ํ•ด๋‹น ์ฟ ํ‚ค์— ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ์„ ์–ธํ•˜๋Š” ์„ค์ •ํ•œ๋‹ค.
- SameSite๋ฅผ ์„ ์–ธํ•˜๋ฉด ์ฟ ํ‚ค๊ฐ€ Cross-Site ์š”์ฒญ์‹œ ์ „์†ก๋˜์ง€ ์•Š๋Š”๋‹ค.
- CSRF (ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์š”์ฒญ ์œ„์กฐ) ๊ณต๊ฒฉ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. (CSRF : ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ์˜์ง€์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๊ณต๊ฒฉ์ž์˜ ์˜๋„๋Œ€๋กœ ์›น ์‚ฌ์ดํŠธ์— ์š”์ฒญ์„ ํ•˜๊ฒŒํ•˜๋Š” ๊ณต๊ฒฉ์ด๋‹ค)
- CSRF๋Š” ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ์„œ๋ฒ„์— ๊ณต๊ฒฉ์„ ๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
์ฟ ํ‚ค์˜ ์ข…๋ฅ˜
์ข…๋ฅ˜ ์„ค๋ช…
Session Cookie ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ์ €์žฅ๋˜๋Š” ์ฟ ํ‚ค์ด๋‹ค.
- ๋ธŒ๋ผ์šฐ์ € ์ข…๋ฃŒ์‹œ ์‚ญ์ œ๋œ๋‹ค.
- ์ฟ ํ‚ค์˜ Expires ์†์„ฑ์ด ์—†์œผ๋ฉด Session Cookie๋กœ ๊ฐ„์ฃผํ•œ๋‹ค.
Persistent Cookie ์žฅ๊ธฐ๊ฐ„ ์œ ์ง€๋˜๋Š” ์ฟ ํ‚ค์ด๋‹ค.
- ํŒŒ์ผ๋กœ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ € ์ข…๋ฃŒ์‹œ์—๋„ ์œ ์ง€๋œ๋‹ค. (ex) Max-Age : 1๋…„)
- ์ฟ ํ‚ค์˜ Expires ์†์„ฑ์ด ์žˆ์œผ๋ฉด Persistent Cookie๋กœ ๊ฐ„์ฃผํ•œ๋‹ค.
Secure Cookie HTTPS์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ์ฟ ํ‚ค์ด๋‹ค.
- ์ฟ ํ‚ค ์ •๋ณด๊ฐ€ ์•”ํ˜ธํ™”๋˜์–ด ์ „์†ก๋œ๋‹ค.
Third-Party Cookie ๋ฐฉ๋ฌธํ•œ ๋„๋ฉ”์ธ๊ณผ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ ์ฟ ํ‚ค์ด๋‹ค.
- ์ฃผ๋กœ ๊ด‘๊ณ  ๋ฐฐ๋„ˆ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์œ ์ž… ๊ฒฝ๋กœ ์ถ”์ ์‹œ ์‚ฌ์šฉ๋œ๋‹ค.

๋™์ž‘ ๋ฐฉ์‹

Untitled

  1. ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„์—๊ฒŒ request ๋ณด๋‚ธ๋‹ค.

  2. ์„œ๋ฒ„๋Š” ์ƒํƒœ ์œ ์ง€๋ฅผ ํ•˜๋ ค๋Š” ๊ฐ’์„ ์ฟ ํ‚ค๋กœ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ response์˜ HTTP ํ—ค๋”(Set-Cookie)์— ํฌํ•จํ•˜์—ฌ ์ „์†กํ•œ๋‹ค.

    TTP/1.0 200 OK
    Content-type: text/html
    Set-Cookie: yummy_cookie=choco
    Set-Cookie: tasty_cookie=strawberry
  3. ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ์ „๋‹ฌ๋ฐ›์€ ์ฟ ํ‚ค๋ฅผ ๋ฐ›์•„ ์ €์žฅํ•˜๊ณ , ๋‹ค์Œ request๋ฅผ ์ „์†กํ•  ๋•Œ HTTP ํ—ค๋”(Cookie)์— ๋‹ด์•„์„œ ์ „์†กํ•œ๋‹ค.

    GET /sample_page.html HTTP/1.1
    Host: www.example.org
    Cookie: yummy_cookie=choco; tasty_cookie=strawberry

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

  1. ์ฟ ํ‚ค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋งค ํ—ค๋”(Http Header)์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์—ย ์ƒ๋‹นํ•œ ํŠธ๋ž™ํ”ฝ์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค

  2. ๋ณด์•ˆ์— ์ทจ์•ฝํ•˜๋‹ค

    ํด๋ผ์ด์–ธํŠธ์˜ request ํ—ค๋”์— ์ฟ ํ‚ค ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋‹ด์•„ ์ „์†กํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ๊ณ  ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ ์œ„๋ณ€์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

  3. ์ฟ ํ‚ค์˜ ๊ฐœ์ˆ˜, ํฌํ‚ค๊ฐ€ ํ•œ์ •๋˜์–ด์žˆ๋‹ค

    ์ฟ ํ‚คย ํ‘œ์ค€์•ˆ์ธ RFC 2109์— ๋”ฐ๋ฅด๋ฉดย ์ฟ ํ‚ค๋Š” 300๊ฐœ๊นŒ์ง€ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ตœ๋Œ€ย ํฌ๊ธฐ๋Š” 4,096๋ฐ”์ดํŠธ(0.004096 MB)์ด๊ณ , ํ•˜๋‚˜์˜ ํ˜ธ์ŠคํŠธ๋‚˜ ๋„๋ฉ”์ธ์—์„œ ์ตœ๋Œ€ 20๊ฐœ๊นŒ์ง€ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค (๋Œ€๋ถ€๋ถ„์˜ ๋ธŒ๋ผ์šฐ์ €๋Š” ํ‘œ์ค€์•ˆ๋ณด๋‹ค ๋” ์ ์€ ๊ฐœ์ˆ˜์˜ ์ฟ ํ‚ค๋งŒ์„ ์ง€์›ํ•œ๋‹ค)

  4. ์›น๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ์ €์žฅํ•œ ์ฟ ๊ธฐ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค

    ์›น ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ์ฟ ํ‚ค์— ๋Œ€ํ•œ ์ง€์› ํ˜•ํƒœ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ €๊ฐ„ ๊ณต์œ ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค


์ฟ ํ‚ค์˜ ๋Œ€์•ˆ

์ฟ ํ‚ค์˜ ๋Œ€์•ˆ : Web Storage API

Web Storage API๋Š” ๊ธฐ์กด ์ฟ ํ‚ค์˜ ๋ฌธ์ œ์ ์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค. (๊ธฐ์กด์—๋Š” ์„œ๋ฒ„๊ฐ€ ๋งŒ๋“  ์ฟ ํ‚ค๋ฅผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด์˜€๋‹ค)

  • Web Storage๋Š” ์ตœ์†Œ 5MB ์ด์ƒ์˜ ๊ณต๊ฐ„์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ์ด ์ •๋ณด๋Š” ์„œ๋ฒ„๋กœ ์ „์†ก๋˜์ง€ ์•Š๋Š”๋‹ค.
  • Origin ๋งˆ๋‹ค Web Storage๊ฐ€ ํ•˜๋‚˜์”ฉ๋งŒ ์กด์žฌํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•˜๋‚˜์˜ Origin์— ์†ํ•˜๋Š” ๋ชจ๋“  ์›น ํŽ˜์ด์ง€๋Š” ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ , ๊ฐ™์€ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
    • Origin : ๋„๋ฉ”์ธ๊ณผ ํ”„๋กœํ† ์ฝœ์˜ ํ•œ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์‹๋ณ„์ž์ด๋‹ค.

Web Storage API๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‘ ๊ฐ€์ง€ ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

  • sessionStorage ๊ฐ์ฒด : ํ•˜๋‚˜์˜ ์„ธ์…˜(session)๋งŒ์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฐ์ฒด
  • localStorage ๊ฐ์ฒด : ๋ณด๊ด€ ๊ธฐํ•œ์ด ์—†๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด

## ์„ธ์…˜์ด๋ž€

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

  • ํ•˜๋‚˜์˜ ์ƒํƒœ = ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ๊ณ ์œ ํ•œ ์‹๋ณ„๊ฐ’ = SessionId
    • ์„œ๋ฒ„๋Š” SessionId๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ๋˜๋Š” Redis์™€ ๊ฐ™์€ ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•œ๋‹ค.
  • ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ํ•˜๋“œ์›จ์–ด์˜ ๋น„์šฉ์ด ๊ฐ์†Œํ•˜์—ฌ ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋Š” ์„œ๋ฒ„์— ์ €์žฅํ•˜๋Š” ์‹์œผ๋กœ ๋ฐœ์ „ํ•˜์˜€๋‹ค.

99FEB34F5B96889D34.png


## ์ฟ ํ‚ค์™€ ์„ธ์…˜

ํ™œ์šฉ ๋ฐฉ์‹

  1. ์„œ๋ฒ„์— ์ €์žฅ๋œ ์„ธ์…˜์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ SessionId๊ฐ’์„ ์ €์žฅํ•˜๋Š” ์šฉ๋„๋กœ ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉ๋œ๋‹ค.

    99376D4C5B96889E11.png

  2. ์œ ํˆฌ๋ธŒ, ๊ตฌ๊ธ€์—์„œ ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์•„๋„ ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๊ทผํ•œ ๋™์˜์ƒ์ด๋‚˜ ๊ฒ€์ƒ‰ ๊ธฐ๋ก์„ ์ฟ ํ‚ค์— ์ €์žฅํ•ด๋‘๊ณ , ํ•ด๋‹น ์ฟ ํ‚ค๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๊ฒ€์ƒ‰ ์ตœ์ ํ™”์— ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

  3. ์‡ผํ•‘๋ชฐ ์‚ฌ์ดํŠธ์—์„œ๋Š” ์‚ฌ์šฉ์ž์˜ ์‡ผํ•‘ ๋™ํ–ฅ์„ ์ฟ ํ‚ค์— ์ €์žฅํ•˜์—ฌ, ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ œํ’ˆ์„ ์ถ”์ฒœํ•œ๋‹ค.

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

Cookie Session
์ €์žฅ์œ„์น˜ ํด๋ผ์ด์–ธํŠธ์˜ ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง€์ •ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋˜๋Š” ํ•˜๋“œ๋””์Šคํฌ์— ์ €์žฅ ์„œ๋ฒ„์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ
์ €์žฅํ˜•์‹ Text Object
๋งŒ๋ฃŒ์‹œ์  ์ฟ ํ‚ค ์ €์žฅ์‹œ expires ์†์„ฑ์œผ๋กœ ์„ค์ •(์„ค์ • ์—†์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ € ์ข…๋ฃŒ ์‹œ) ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋กœ๊ทธ์•„์›ƒํ•˜๊ฑฐ๋‚˜, ์„ค์ • ์‹œ๊ฐ„๋™์•ˆ ๋ฐ˜์‘์ด ์—†์œผ๋ฉด ๋ฌดํšจํ™” ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ •ํ™•ํ•œ ์‹œ์  ์•Œ ์ˆ˜ ์—†์Œ
๋ฆฌ์†Œ์Šค ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅ๋˜๊ณ  ํด๋ผ์ด์–ธํŠธ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„ ์ž์› ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ ์„ธ์…˜์€ ์„œ๋ฒ„์— ์ €์žฅ๋˜๊ณ , ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋กœ๋”ฉ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„ธ์…˜์ด ์ƒ๊ธธ ๋•Œ๋งˆ๋‹ค ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐจ์ง€ํ•จ
์šฉ๋Ÿ‰์ œํ•œ ํด๋ผ์ด์–ธํŠธ๋„ ๋ชจ๋ฅด๊ฒŒ ์ ‘์†๋˜๋Š” ์‚ฌ์ดํŠธ์— ์˜ํ•˜์—ฌ ์„ค์ •๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฟ ํ‚ค๋กœ ์ธํ•ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฑธ ๋ง‰๊ณ ์ž ํ•œ ๋„๋ฉ”์ธ๋‹น 20๊ฐœ, ํ•˜๋‚˜์˜ ์ฟ ํ‚ค ๋‹น 4KB๋กœ ์ œํ•œํ•ด ๋‘  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ‘์†ํ•˜๋ฉด ์„œ๋ฒ„์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋ฏ€๋กœ ๊ฐœ์ˆ˜๋‚˜ ์šฉ๋Ÿ‰ ์ œํ•œ ์—†์Œ

## ์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ์ธ์ฆ

์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๊ณผ์ •

image.png

  1. ํด๋ผ์ด์–ธํŠธ๋Š” ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ์„œ๋ฒ„์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค
  2. ์„œ๋ฒ„๋Š” DB๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ๊ฒ€์ฆํ•˜๊ณ , ์ •ํ™•ํ•˜๋‹ค๋ฉด ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•  ๊ณ ์œ  SessionID๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ดํ›„ HTTP response ํ—ค๋”์˜ Set-Cookieํ•„๋“œ์— SessionID๋ฅผ ๋‹ด์•„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค
  3. ํด๋ผ์ด์–ธํŠธ๋Š” ์ „๋‹ฌ๋ฐ›์€ SessionID๋ฅผ ์ฟ ํ‚ค์— ์ €์žฅํ•˜๊ณ , ์š”์ฒญ์‹œ HTTP request ํ—ค๋”์˜ Cookie ํ•„๋“œ์— ์ฟ ํ‚ค๋ฅผ ๋‹ด์•„ ์„œ๋ฒ„์— ์ „๋‹ฌํ•œ๋‹ค.
  4. ์„œ๋ฒ„๋Š” ์ฟ ํ‚ค๋ฅผ ๋ฐ›์•„ ์„ธ์…˜ ์ €์žฅ์†Œ๋ฅผ ํ†ตํ•ด SessionID์˜ ์œ ํšจ์„ฑ์„ ํ™•์ธํ•œ ์ดํ›„, ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. (์„ธ์…˜์ €์žฅ์†Œ๋Š” WAS์˜ ์„ธ์…˜, RDB, In-memory DB๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค)

์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ์˜ ๋ฌธ์ œ์ 

  1. ์„œ๋ฒ„ ๋ถ€ํ•˜ ๋ฌธ์ œ

    ๋งŒ์•ฝ ์‚ฌ์šฉ์ž ์ˆ˜๊ฐ€ ๋งŽ์•„์ง€๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•  ์„ธ์…˜ ์ •๋ณด๊ฐ€ ๋งŽ์•„์ง„๋””. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ๋””์Šคํฌ ๋ถ€ํ•˜(disk I/O)๋ฅผ ์ผ์œผํ‚จ๋‹ค.

  2. ํ™•์žฅ์„ฑ ๋ฌธ์ œ

    ๋” ๋งŽ์€ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์›น ์„œ๋ฒ„๋ฅผ ์ฆ์„คํ•  ๊ฒฝ์šฐ, ์ƒˆ๋กœ์šด ์›น ์„œ๋ฒ„์— ๊ธฐ์กด์˜ ์„ธ์…˜ ์ •๋ณด๋ฅผ ์˜ฎ๊ฒจ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Scaling Out์ด ์–ด๋ ค์›Œ์ง„๋‹ค.

  3. CORS(Cross-origin resource sharing) ๋ฐฉ์‹

    ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์„ธ์…˜ ๊ด€๋ฆฌ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ฟ ํ‚ค๋Š” ๋‹จ์ผ ๋„๋ฉ”์ธ/์„œ๋ธŒ ๋„๋ฉ”์ธ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ๊ธฐ ๋•Œ๋ฌธ์— Cross-Origin์—์„œ ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ์ด์ฒ˜๋Ÿผ ์ฟ ํ‚ค๋ฅผ ์—ฌ๋Ÿฌ ๋„๋ฉ”์ธ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ๋ฒˆ๊ฑฐ๋กญ๋‹ค๋Š” ์ ์—์„œ ์ฟ ํ‚ค, ์„ธ์…˜์„ ์ด์šฉํ•œ ์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋ ต๋‹ค.

    cross-origin์ด๋ž€

    cross-origin์ด๋ž€ ๋‹ค์Œ ์ค‘ ํ•œ ๊ฐ€์ง€๋ผ๋„ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค.

    1. ํ”„๋กœํ† ์ฝœ - http์™€ https๋Š” ํ”„๋กœํ† ์ฝœ์ด ๋‹ค๋ฅด๋‹ค.
    2. ๋„๋ฉ”์ธ - domain.com๊ณผ other-domain.com์€ ๋‹ค๋ฅด๋‹ค.
    3. ํฌํŠธ ๋ฒˆํ˜ธ - 8080ํฌํŠธ์™€ 3000ํฌํŠธ๋Š” ๋‹ค๋ฅด๋‹ค.

ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ (JWT ํ† ํฐ)

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

  • ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ ์ •๋ณด๋ฅผ ์„œ๋ฒ„์— ์ €์žฅํ•˜์ง€ ์•Š๊ณ , ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ๋งŒ์œผ๋กœ ์ธ์ฆ์ฒ˜๋ฆฌํ•œ๋‹ค.

์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ๊ณผ ๋‹ฌ๋ฆฌ ์ƒํƒœ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ statelessํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค.


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

image.png

  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ์„œ๋ฒ„์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.
  2. ์„œ๋ฒ„๋Š” ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ๊ฒ€์ฆํ•˜๊ณ , ์ •ํ™•ํ•˜๋‹ค๋ฉด ์‚ฌ์šฉ์ž ์‹๋ณ„ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Token์„ ๋ฐœ๊ธ‰ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.
  3. ํด๋ผ์ด์–ธํŠธ๋Š” ์ „๋‹ฌ๋ฐ›์€ Token์„ ์ฟ ํ‚ค๋‚˜ localStorage, sessionStorage ๋“ฑ์— ์ €์žฅํ•˜๊ณ , ์ดํ›„ ์š”์ฒญ์‹œ์— Token์„ ๋‹ด์•„ ์ „๋‹ฌํ•œ๋‹ค.
  4. ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ Token์„ ๊ฒ€์ฆํ•˜๊ณ  ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ์˜ ์ด์ 

  1. Stateless(๋ฌด์ƒํƒœ์„ฑ) & ํ™•์žฅ์„ฑ

    ํ† ํฐ์€ ์„œ๋ฒ„๊ฐ€ ์•„๋‹Œ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„๋Š” Statelessํ•˜๋ฉฐ, ์„œ๋ฒ„ ํ™•์žฅ์‹œ ์„ธ์…˜ ์ •๋ณด๋กœ ์ธํ•œ Scaling Out์— ์ œ์•ฝ์ด ์—†๋‹ค.

  2. ์—ฌ๋Ÿฌ ํ”Œ๋žซํผ ๋ฐ ๋„๋ฉ”์ธ์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅ โ†’ CORS ๋ฌธ์ œ ํ•ด๊ฒฐ

    ๋””๋ฐ”์ด์Šค์˜ ์ข…๋ฅ˜ ๋ฐ ๋„๋ฉ”์ธ๊ณผ ์ƒ๊ด€์—†์ด ํ† ํฐ ๊ธฐ๋ฐ˜์˜ ์ธ์ฆ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ์ฃผ๋กœ JSON ํฌ๋งท์˜ JWT ํ† ํฐ์„ ์‚ฌ์šฉํ•œ๋‹ค.

JWT(JSON Web Token)

JSON ํฌ๋งท์„ ์ด์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” Claim ๊ธฐ๋ฐ˜์˜ Web Token์œผ๋กœ ๋ชจ๋ฐ”์ผ์ด๋‚˜ ์›น์˜ ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์•”ํ˜ธํ™” ํ† ํฐ์ด๋‹ค.

  • JWT๋Š” URL์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋„๋ก Base64url ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•˜๋ฉฐ ํ—ค๋” + ๋‚ด์šฉ+ ์„œ๋ช…์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋‹ค.
  • key=value ํ˜•์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํ•œ ์Œ์˜ ์ •๋ณด๋ฅผ Claim์ด๋ผ๊ณ  ์นญํ•œ๋‹ค.
JWT ์ด์ „์˜ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹
์ธ์ฆํƒ€์ž… ์„ค๋ช…
Basic ์‚ฌ์šฉ์ž ์•„์ด๋””์™€ ์•”ํ˜ธ๋ฅผ Base64๋กœ ์ธ์ฝ”๋”ฉํ•œ ๊ฐ’์„ ํ† ๊ทผ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.(RFC 7617)
Bearer JWT ํ˜น์€ OAuth์— ๋Œ€ํ•œ ํ† ํฐ์„ ์‚ฌ์šฉํ•œ๋‹ค. (RFC 6750)
Digest ์„œ๋ฒ„์—์„œ ๋‚œ์ˆ˜ ๋ฐ์ดํ„ฐ ๋ฌธ์ž์—ด์„ ํด๋ผ์ด์–ธํŠธ์— ๋ณด๋‚ธ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด์™€ nonce๋ฅผ ํฌํ•จํ•˜๋Š” ํ•ด์‹œ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์‘๋‹ตํ•œ๋‹ค (RFC 7616)
HOBA ์ „์ž ์„œ๋ช… ๊ธฐ๋ฐ˜ ์ธ์ฆ (RFC 7486)
Mutual ์•”ํ˜ธ๋ฅผ ์ด์šฉํ•œ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ์ƒํ˜ธ ์ธ์ฆ (draft-ietf-httpauth-mutual)
AWS4-HMAC-SHA256 AWS ์ „์ž ์„œ๋ช… ๊ธฐ๋ฐ˜ ์ธ์ฆ

JWT ๊ตฌ์„ฑ

image.png

curl http://127.0.0.1:8000/toktokhan/ -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

header = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
payload = eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
signature = SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
  1. ํ—ค๋” header

    JWT ํ† ํฐ์˜ ํƒ€์ž…๊ณผ ์‚ฌ์šฉ๋˜๋Š” ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜(HMAC SHA256 ๋˜๋Š” RSA) ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์žˆ๋‹ค.

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 ๋ฅผ ๋””์ฝ”๋”ฉํ•˜๋ฉด

    {
      "typ": "JWT",
      "alg": "HS256"
    }
  2. ๋‚ด์šฉ payload

    ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ๋‹ค.

    • ์•ฝ์†๋œ Claim์œผ๋กœ๋Š” iss(๋ฐœ๊ธ‰์ž), sub(ํ† ํฐ๋ช…), aud(๋Œ€์ƒ์ž), exp(๋งŒ๋ฃŒ์ผ์ž), nbf(ํ™œ์„ฑ์ผ์ž), iat(๋ฐœ๊ธ‰์ผ์ž), jti(๊ณ ์œ ์‹๋ณ„์ž) ๋“ฑ์ด ์„ ํƒ์ ์œผ๋กœ ํฌํ•จ ๋  ์ˆ˜ ์žˆ๋‹ค. (๋ชจ๋“  ์ผ์ž ์ •๋ณด๋Š” NumericDate ํ˜•ํƒœ์ด๋‹ค)
    • JWT๋ฅผ ๋””์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ์ƒ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ payload์— ๋‹ด์•„์„œ๋Š” ์•ˆ๋œ๋‹ค

    eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ ๋ฅผ ๋””์ฝ”๋”ฉํ•˜๋ฉด

    {
      "sub": "1234567890", // ๋“ฑ๋ก๋œ ํ”Œ๋ ˆ์ž„
      "name": "John Doe", // ๋น„๊ณต๊ฐœ ํ”Œ๋ ˆ์ž„
      "iat": 1516239022  // ๋“ฑ๋ก๋œ ํ”Œ๋ ˆ์ž„
    }
  3. ์„œ๋ช… signature

    ์„œ๋ช…์€ header์™€ payload๋ฅผ ๋”ํ•œ ๋’ค secret key๋กœ ํ•ด์‹ฑํ•˜์—ฌ ์ƒ์„ฑํ•œ๋‹ค.

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

    SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c ๋ฅผ ๋””์ฝ”๋”ฉํ•˜๋ฉด

    HMACSHA256(
      base64UrlEncode(header) + "." + base64UrlEncode(payload),
      your-256-bit-secret
    )

JWT์˜ ์žฅ๋‹จ์ 

์žฅ์  ๋‹จ์ 
1. Header์™€ Payload๋ฅผ ๊ฐ€์ง€๊ณ  Signature๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ์œ„๋ณ€์กฐ๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค. 1. ์ฟ ํ‚ค/์„ธ์…˜๊ณผ ๋‹ค๋ฅด๊ฒŒ JWT๋Š” ํ† ํฐ์˜ ๊ธธ์ด๊ฐ€ ๊ธธ์–ด, ์ธ์ฆ ์š”์ฒญ์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜๊ฐ€ ์‹ฌํ•ด์ง„๋‹ค.
2. ์ธ์ฆ ์ •๋ณด์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ์ €์žฅ์†Œ๊ฐ€ ํ•„์š”์—†๋‹ค. 2. Payload ์ž์ฒด๋Š” ์•”ํ˜ธํ™” ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ €์˜ ์ค‘์š”ํ•œ ์ •๋ณด๋Š” ๋‹ด์„ ์ˆ˜ ์—†๋‹ค.
3. JWT๋Š” ํ† ํฐ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ •๋ณด์™€ ์ „๋‹ฌํ•  ์ •๋ณด ๋ฐ ํ† ํฐ์ด ๊ฒ€์ฆ๋ฌ์Œ์„ ์ฆ๋ช…ํ•˜๋Š” ์„œ๋ช… ๋“ฑ ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์ž์ฒด์ ์œผ๋กœ ์ง€๋‹ˆ๊ณ  ์žˆ๋‹ค. 3. ํ† ํฐ์€ ํ•œ๋ฒˆ ๋ฐœ๊ธ‰ ๋˜๋ฉด ์œ ํšจ๊ธฐ๊ฐ„์ด ๋งŒ๋ฃŒ๋  ๋•Œ ๊ณ„์† ์‚ฌ์šฉ๋˜์–ด ํƒˆ์ทจ ๋‹นํ•˜๊ฒŒ ๋˜๋ฉด ๋Œ€์ฒ˜ํ•˜๊ธฐ ํž˜๋“ค๋‹ค.

JWT์˜ ๋ณด์•ˆ ์ „๋žต

  1. ์งง์€ ๋งŒ๋ฃŒ๊ธฐํ•œ ์„ค์ •

    ํ† ํฐ์˜ ๋งŒ๋ฃŒ์‹œ๊ฐ„์„ ์งง๊ฒŒ ์„ค์ •ํ•˜์—ฌ ํƒˆ์ทจ๋˜๋”๋ผ๋„ ํ”ผํ•ด๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

    ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์„ ์ž์ฃผ ํ•ด์•ผํ•œ๋‹ค๋Š” ๋ถˆํŽธํ•จ์ด ์กด์žฌํ•œ๋‹ค.

  2. Refresh Token

    Untitled

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

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

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

    ํ•˜์ง€๋งŒ Refresh Token์„ ์„œ๋ฒ„์— ์ €์žฅํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Statelessํ•œ ์„œ๋ฒ„๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ฒŒํ•˜๋Š” JWT์˜ ์žฅ์ ์„ ์™„๋ฒฝํ•˜๊ฒŒ ๋ˆ„๋ฆด ์ˆ˜ ์—†๋‹ค.


์ฐธ๊ณ 

์„œ๋ฒ„ ์ธ์ฆ. ์ฟ ํ‚ค(Cookie), ์„ธ์…˜(Session), ํ† ํฐ(JWT)

[HTTP] HTTP ์ฟ ํ‚ค๋ž€(COOKIE)? ์ฟ ํ‚ค ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ ๊ทธ๋ฆฌ๊ณ  ์ฟ ํ‚ค์™€ ์„ธ์…˜์˜ ์ฐจ์ด์ .

์ฟ ํ‚ค,์„ธ์…˜,JWT, mozilla, ์ฟ ํ‚ค(Cookie) ๊ทธ๋ฆฌ๊ณ  ์„ธ์…˜(Session)

Web Storage

์ฟ ํ‚ค ์†์„ฑ, ์ฟ ํ‚ค์˜ ๋‹จ์ 

์ธ์ฆ ๋ฐฉ์‹ : Cookie & Session vs JWT

์„ธ์…˜ ์ €์žฅ์†Œ

JWT

๋ฉด์ ‘ ์˜ˆ์ƒ ์งˆ๋ฌธ

์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฐฉ์‹์˜ ์ข…๋ฅ˜๋ฅผ ๋งํ•ด๋ณด์„ธ์š”

์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ์ธ์ฆ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋ณด์„ธ์š”

ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋ณด์„ธ์š”

์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ์ธ์ฆ์˜ ๋‹จ์ ๊ณผ JWT๋ฅผ ์ด์šฉํ•œ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์˜ ์žฅ๋‹จ์ ์„ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”

JWT๋ฅผ ์ด์šฉํ•œ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹์—์„œ Refresh Token์˜ ์šฉ๋„๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€์š”?