[250213] TIL

์˜ค๋Š˜ ํ•œ ๊ฒƒ

๋ธŒ๋ผ์šฐ์ € ๋™์ž‘ ๋ฐฉ์‹ ๋ธ”๋กœ๊ทธ ๊ธ€ ์ž‘์„ฑ

Stateful๊ณผ Stateless ์ฐจ์ด

Stateful

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด์ „ ๋‹จ๊ณ„์—์„œ ์ œ๊ณตํ•œ ๊ฐ’์„ ์„œ๋ฒ„๊ฐ€ ์ €์žฅํ•˜๊ณ  ์ดํ›„์—๋„ ์œ ์ง€

Stateless

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด์ „ ๋‹จ๊ณ„์—์„œ ์ œ๊ณตํ•œ ๊ฐ’์„ ์„œ๋ฒ„๊ฐ€ ์ €์žฅํ•˜์ง€ ์•Š์Œ

HTTP๋Š” Stateless ํ”„๋กœํ† ์ฝœ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. Stateless์˜ ์˜๋ฏธ๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์‚ฌ์šฉ์ž ์ƒํƒœ๋‚˜ ์„ธ์…˜์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋ฐฉ๋ฒ•๋“ค์„ ์‚ฌ์šฉํ•˜๋‚˜์š”?

A. Stateless ํ”„๋กœํ† ์ฝœ์ด๋ž€, ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์ •๋ณด๋ฅผ ๋ณด์กดํ•˜์ง€ ์•Š๊ณ  ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต๋งŒ ๋ณด๋‚ด์ฃผ๋Š” ํ”„๋กœํ† ์ฝœ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

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

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

HTTP ๋ฉ”์†Œ๋“œ๋ž€?

HTTP ๋ฉ”์†Œ๋“œ๋ž€ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์‚ฌ์ด์— ์š”์ฒญ๊ณผ ์‘๋‹ต์ด ์ด๋ฃจ์–ด์ง€๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธํ•œ๋‹ค.

๋ฉฑ๋“ฑ์„ฑ(Idempotent)์ด๋ž€?

๋ฉฑ๋“ฑ์„ฑ์ด๋ž€ ์—ฐ์‚ฐ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์ ์šฉํ•˜๋”๋ผ๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€์ง€ ์•Š๋Š” ์„ฑ์งˆ์„ ์˜๋ฏธํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์–ด๋–ค ์ˆซ์ž์— 1์„ ๊ณฑํ•˜๋Š” ์—ฐ์‚ฐ์€ ์—ฌ๋Ÿฌ ๋ฒˆ ์ˆ˜ํ–‰ํ•ด๋„ ์ฒ˜์Œ 1์„ ๊ณฑํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ์ˆซ์ž๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— 1์„ ๊ณฑํ•˜๋Š” ์—ฐ์‚ฐ์€ ๋ฉฑ๋“ฑ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

HTTP ์ฃผ์š” ๋ฉ”์†Œ๋“œ์˜ ๋ฉฑ๋“ฑ์„ฑ ๋ณด์žฅ ์—ฌ๋ถ€

๋ฉ”์†Œ๋“œ ๋ฉฑ๋“ฑ์„ฑ ์—ฌ๋ถ€
GET O
POST X
PUT O
PATCH X
DELETE O

์•ˆ์ „์„ฑ์ด๋ž€?

์„œ๋ฒ„์˜ ์ƒํƒœ(๋ฐ์ดํ„ฐ)๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰, ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๋™์ผํ•œ ์š”์ฒญ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ณด๋‚ด๋”๋ผ๋„ ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.

HTTP ์ฃผ์š” ๋ฉ”์†Œ๋“œ์˜ ์•ˆ์ „์„ฑ ๋ณด์žฅ ์—ฌ๋ถ€

๋ฉ”์†Œ๋“œ ์•ˆ์ „์„ฑ ์—ฌ๋ถ€
GET O
POST X
PUT X
PATCH X
DELETE X

Server์™€ Web Application Server ์ฐจ์ด

์›น์„œ๋ฒ„ WS

  • ์ •์  ์ปจํ…์ธ ์˜ ์ „๋‹ฌ์ด ํ•ต์‹ฌ
  • ๋ฐ”๋กœ WAS๊ฐ€ ํƒ„์ƒํ•œ๊ฑด ์•„๋‹™๋‹ˆ๋‹ค. ์›น ์„œ๋ฒ„๋งŒ์œผ๋กœ ๋™์  ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์ด ์‚ฌ์šฉ (CGI)

์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„ WAS

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

์ถ”๊ฐ€๋กœ ์•Œ๋ฉด ์ข‹์€ ์ 

  • ๋ณด์•ˆ (์™ธ๋ถ€๋ง๊ณผ ๋‚ด๋ถ€๋ง)
  • ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ
  • ์›น์„œ๋ฒ„๋กœ๋„ ๋™์  ์ปจํ…์ธ  ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค

์ •์  ์›น ํŽ˜์ด์ง€์™€ ๋™์  ์›น ํŽ˜์ด์ง€์˜ ์ฐจ์ด

  • ์ •์  ์›น ํŽ˜์ด์ง€๋Š” ์„œ๋ฒ„์—์„œ ๋ฏธ๋ฆฌ ์ •์ ์ธ ์ปจํ…์ธ ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹
  • ๋™์  ์›น ํŽ˜์ด์ง€๋Š” ์„œ๋ฒ„์—์„œ ๋™์ ์œผ๋กœ ์ปจํ…์ธ ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹

ํ‘œ๋กœ ๋น„๊ต ์ •๋ฆฌ

๊ตฌ๋ถ„ ์ •์  ์›น ํŽ˜์ด์ง€ ๋™์  ์›น ํŽ˜์ด์ง€
๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ HTML ํŒŒ์ผ ์ง์ ‘ ์ˆ˜์ • ํ•„์š” ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต ํ›„ ์ œ๊ณต
์‘๋‹ต ์†๋„ ๋น ๋ฆ„ (๊ทธ๋ƒฅ HTML ์ œ๊ณต) ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆผ (์„œ๋ฒ„ ์ฒ˜๋ฆฌ ํ•„์š”)
์„œ๋ฒ„ ๋ถ€ํ•˜ ๊ฑฐ์˜ ์—†์Œ ์š”์ฒญ๋งˆ๋‹ค ์„œ๋ฒ„์—์„œ HTML ์ƒ์„ฑ ํ•„์š”
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ ์‚ฌ์šฉ ์•ˆ ํ•จ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
๋ณด์•ˆ์„ฑ ๋†’์Œ (๋‹จ์ˆœ HTML ์ œ๊ณต) ์ƒ๋Œ€์ ์œผ๋กœ ๋‚ฎ์Œ (๋ณด์•ˆ ๊ด€๋ฆฌ ํ•„์š”)
์‚ฌ์šฉ ์˜ˆ์‹œ ํฌํŠธํด๋ฆฌ์˜ค, ์†Œ๊ฐœ ํŽ˜์ด์ง€ ์‡ผํ•‘๋ชฐ, SNS, ๊ฒ€์ƒ‰ ์—”์ง„

JWTํ† ํฐ์ด ํƒˆ์ทจ ๋‹นํ–ˆ์„๋•Œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•

XSS (Cross-Site Scripting) ๊ณต๊ฒฉ

  • HttpOnly ์ฟ ํ‚ค ์‚ฌ์šฉ โ†’ JavaScript์—์„œ JWT ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•œ๋‹ค.
  • CSP(Content Security Policy) ์ ์šฉ โ†’ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ๋ฐฉ์ง€ํ•œ๋‹ค.
  • ์ž…๋ ฅ ๊ฐ’ ๊ฒ€์ฆ ๋ฐ ํ•„ํ„ฐ๋ง โ†’ <script> ํƒœ๊ทธ ์‚ฝ์ž…์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

MITM (Man-in-the-Middle) ๊ณต๊ฒฉ

  • HTTPS ์‚ฌ์šฉ โ†’ ํ†ต์‹  ์•”ํ˜ธํ™”๋ฅผ ํ†ตํ•ด ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.
  • TLS(Transport Layer Security) ํ†ต์‹  โ†’ ํ†ต์‹  ์•”ํ˜ธํ™”๋ฅผ ํ†ตํ•ด ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.
  • ์ตœ์‹  ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ โ†’ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ•ํ™”๋ฅผ ํ†ตํ•ด ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

๋กœ์ปฌ ์ €์žฅ์†Œ ์œ ์ถœ

  • HttpOnly ์ฟ ํ‚ค ์‚ฌ์šฉ
  • Secure ์ฟ ํ‚ค ์†์„ฑ ์‚ฌ์šฉ
  • JWT ๋ฅผ ๋ธŒ๋ผ์šฐ์ € ๋กœ์ปฌ ์ €์žฅ์†Œ์— ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ž˜๋ชป๋œ ํ† ํฐ ์ €์žฅ ๋ฐ ๊ณต์œ 

  • JWT๋ฅผ URL์— ํฌํ•จํ•˜์ง€ ์•Š๊ณ , HTTP ํ—ค๋”(Authorization: Bearer โ€ฆ)๋กœ ์ „์†กํ•œ๋‹ค.
  • ํ† ํฐ์„ Secure ์ฟ ํ‚ค์— ์ €์žฅํ•˜๊ณ , ํ•„์š”ํ•  ๋•Œ๋งŒ ์ ‘๊ทผํ•œ๋‹ค.

์ทจ์•ฝํ•œ Refresh Token ๊ด€๋ฆฌ

  • Refresh Token์„ HttpOnly & Secure ์ฟ ํ‚ค์— ์ €์žฅํ•œ๋‹ค.
  • Refresh Token์„ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ์žฌ๋ฐœ๊ธ‰ํ•˜๊ณ , ์ด์ „ Refresh Token์„ ํ๊ธฐํ•œ๋‹ค.
  • Refresh Token์„ ์„œ๋ฒ„์—์„œ ๊ด€๋ฆฌํ•˜๊ณ , ์žฌ์‚ฌ์šฉ ๋ฐฉ์ง€(Rotation) ์ •์ฑ…์„ ์ ์šฉํ•œ๋‹ค.

Categories:

Updated:

Leave a comment