CORS.md

๐Ÿก

CORS & SOP

origin, CORS, SOP์™€ CORS ์‹œ๋‚˜๋ฆฌ์˜ค, ๊ทธ๋ฆฌ๊ณ  Proxy์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

Origin์ด๋ž€?

์ถœ์ฒ˜ origin

  • ์›น ํŽ˜์ด์ง€ ๋˜๋Š” ์ž์›์— ์•ก์„ธ์Šคํ•˜๋Š” ํŠน์ • ํ”„๋กœํ† ์ฝœ, ํ˜ธ์ŠคํŠธ, ํฌํŠธ์˜ ์กฐํ•ฉ

ํ™•์ธํ•˜๋Š” ๊ณณ

  • window location๊ฐ์ฒด์˜ origin
  • ๋ธŒ๋ผ์šฐ์ €์˜ ๊ด€๋ฆฌ์ž ๋„๊ตฌ์˜ ๋„คํŠธ์›Œํฌ ์š”์ฒญ
    • Request์˜ origin ํ—ค๋”
      image
    • Response์˜ Access-Control-Allow-Originํ—ค๋”
      image

CORS์™€ SOP๊ฐ€ ์™œ ํ•„์š”ํ•˜๋‚˜์š”?

  • ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณด์•ˆ์„ ์œ„ํ•œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

    • CORS๋Š” cross-site ๊ณต๊ฒฉ์„ ๋ง‰๊ธฐ ์œ„ํ•œ ๋ณด์•ˆ ๋งค์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ex) CSRF, XSS

    ๐Ÿค” CSRF (Cross-Site Request Forgery) : ์ด๋ฏธ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๊ฐ€ ์›น ์‚ฌ์ดํŠธ์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์†์ด๋Š” ๊ณต๊ฒฉ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฉ๋ฌธํ•˜๋Š” ์›น ์‚ฌ์ดํŠธ์— ์•…์„ฑ ๋งํฌ ๋˜๋Š” ์–‘์‹์„ ์‚ฝ์ž…ํ•˜์—ฌ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญํ•˜๋ฉด, ๋Œ€์ƒ ์›น ์‚ฌ์ดํŠธ์—์„œ ์ž‘์—…์ด ์ˆ˜ํ–‰๋˜๋ฉฐ ์‚ฌ์šฉ์ž๋Š” ์ด๋ฅผ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. CORS๋Š” ์ธ์ฆ๋œ ๋„๋ฉ”์ธ์œผ๋กœ๋ถ€ํ„ฐ์˜ ์š”์ฒญ๋งŒ ํ—ˆ์šฉํ•˜๊ณ  ์ธ์ฆ๋˜์ง€ ์•Š์€ ๋„๋ฉ”์ธ์œผ๋กœ๋ถ€ํ„ฐ์˜ ์š”์ฒญ์€ ๊ฑฐ๋ถ€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ CSRF๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    XSS(Cross-Site Scripting) : ๊ณต๊ฒฉ์ž๊ฐ€ ์›น ์‚ฌ์ดํŠธ์— ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ณต๊ฒฉ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์›น ์‚ฌ์ดํŠธ๊ฐ€ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์ ์ ˆํ•˜๊ฒŒ ๊ฒ€์ฆํ•˜์ง€ ์•Š๊ณ  ์•…์„ฑ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CORS๋Š” ์ธ์ฆ๋œ ๋„๋ฉ”์ธ์—์„œ๋งŒ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํ•˜์—ฌ XSS ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (+XSS filter, whitelist lib)

    | ๊ฐœ๋… | ์˜์–ด | ์“ฐ์ž„ | ์š”์•ฝ | | --- | --- | --- | --- | | CORS | Cross-Origin Resource Sharing | ๋ณด์•ˆ ๋งค์ปค๋‹ˆ์ฆ˜ | ์„œ๋ฒ„๊ฐ€ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ ์ž์›์— ์•ก์„ธ์Šค ํ•˜๋„๋ก ํ—ˆ์šฉ | | CSRF | Cross-Site Request Forgery | ๋ณด์•ˆ ๊ณต๊ฒฉ | ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๊ฐ€ ์•…์„ฑ ๋งํฌ์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•จ | | XSS | Cross-Site Scripting | ๋ณด์•ˆ ๊ณต๊ฒฉ | ์›น ์‚ฌ์ดํŠธ์— ์•…์„ฑ ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ์‹คํ–‰ํ•˜๊ฒŒ ํ•จ |


Cross-Origin Resource Sharing

๐Ÿ‘‰ CORS๋Š” "Cross-Origin Resource Sharing", ๊ต์ฐจ ์ถœ์ฒ˜ ์ž์› ๊ณต์œ ์˜ ์•ฝ์ž์ž…๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ ๋„๋ฉ”์ธ์—์„œ ์ž‘์„ฑ๋œ ์›น ํŽ˜์ด์ง€๊ฐ€ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ ์ž์›์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ์ •์ฑ…์ž…๋‹ˆ๋‹ค. ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์œผ๋กœ์˜ ์š”์ฒญ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— CORS๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, CORS๋Š” ์„œ๋ฒ„๊ฐ€ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ ์›น ํŽ˜์ด์ง€์—์„œ ์ž์›์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๊ฒŒ๊ธˆ ํ•ฉ๋‹ˆ๋‹ค.

SOP Same-Origin Policy

๐Ÿ‘‰ SOP๋Š” "Same-Origin Policy" ๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ…์˜ ์•ฝ์ž์ž…๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ origin์—์„œ ์ž‘์„ฑ๋œ ์›น ํŽ˜์ด์ง€๊ฐ€ ๋‹ค๋ฅธ origin์˜ ์›น ํŽ˜์ด์ง€ ๋˜๋Š” ์ž์›๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(์ž์› ์˜ˆ์‹œ: ์Šคํฌ๋ฆฝํŠธ, ์ด๋ฏธ์ง€, ์Šคํƒ€์ผ์‹œํŠธ ๋“ฑ)

๊ฐ™์€ ์ถœ์ฒ˜ ์˜ˆ์‹œ

  • https://google.co.kr์™€ ๊ฐ™์€ origin์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

| url | Same Origin | ์„ค๋ช… | | --- | --- | --- | | https://google.co.kr/maps | O | ํ˜ธ์ŠคํŠธ๊ฐ€ ๊ฐ™์Œ | | http://google.co.kr | X | ํฌํŠธ๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ ๋‹ค๋ฅธ origin์ž…๋‹ˆ๋‹ค. | | https://google.co.kr:443/maps?hl=en&authuser=0 | O | ํฌํŠธ๋ฒˆํ˜ธ๊ฐ€ ์˜๋„์ ์œผ๋กœ ๋ช…์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.(https) | | https://api.google.co.kr | X | ํ˜ธ์ŠคํŠธ๊ฐ€ ๋‹ค๋ฆ„ | | https://google.co.kr:8080 | ฮ” | ๋Œ€๋ถ€๋ถ„์˜ ๋ธŒ๋ผ์šฐ์ €: ๊ฐ™์€ ์ถœ์ฒ˜ / IE: ๋‹ค๋ฅธ ์ถœ์ฒ˜ |

๐Ÿค” port์— ๋Œ€ํ•œ CORS ์ •์ฑ…์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ™์€ ํ˜ธ์ŠคํŠธ์˜ ๋‹ค๋ฅธ ํ”„๋กœํ† ์ฝœ์ด ๋™์ผ ์ถœ์ฒ˜์ด๋ƒ์— ๋Œ€ํ•ด์„œ ๋ธŒ๋ผ์šฐ์ €์˜ ์ฐจ์ด๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

(IE : ํฌํŠธ๊ฐ€ ๋‹ค๋ฅด๋ฉด ๊ฐ™์€ ์ถœ์ฒ˜๋กœ ์ธ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ˆ๋…• IE!)


CORS ์‹œ๋‚˜๋ฆฌ์˜ค

๐Ÿ‘‰ request์™€ response์˜ ํ—ค๋”๋ฅผ ๋น„๊ตํ•˜์—ฌ ๊ฐ™์€ ์ถœ์ฒ˜๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  • Request์˜ origin ํ—ค๋”
    image
  • Response์˜ Access-Control-Allow-Originํ—ค๋”
    image

1. ์‚ฌ์ „ ์š”์ฒญ Preflight Request

| ๊ตฌ๋ถ„ | ์กฐ๊ฑด | ๋น„๊ณ  | | --- | --- | --- | | Method | OPTIONS | ์ถœ์ฒ˜ | | Prefilight Request | Origin, Access-Control-Request-Header, Access-Control-Request-Method | ์‹ค์ œ ์š”์ฒญ์˜ ๋ฉ”์†Œ๋“œ & ํ—ค๋” | | Prefilight Response | Access-Control-Allow-Origin, Access-Control-Allow-Methods, Access-Control-Allow-Headers, Access-Control-Max-Age | ํ—ˆ๊ฐ€ํ•œ ์ถœ์ฒ˜ & ๋ฉ”์†Œ๋“œ & ํ—ค๋” ๊ทธ๋ฆฌ๊ณ  ์‘๋‹ต ์บ์‹œ ์‹œ๊ฐ„ |

์‚ฌ์ „ ์š”์ฒญ Preflight์ด๋ž€?

image

  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„์— ์ ‘์†ํ•˜๋ฉด, OPTIONS ๋ฉ”์†Œ๋“œ๋กœ ์˜ˆ๋น„์š”์ฒญ(์‚ฌ์ „ ์š”์ฒญ)์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
    • Origin๊ณผ Acess-control-allow-origin์ด ๊ฐ™์œผ๋ฉด 200 OK : ๋ณธ ์š”์ฒญ(์‹ค์ œ ์š”์ฒญ)์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

๐Ÿ‘‰ ๋‚ด์šฉ

  • prefilight request
    • Origin ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์˜ˆ๋น„์š”์ฒญ ์ดํ›„ ๋ณด๋‚ผ ๋ณธ ์š”์ฒญ์— ๋Œ€ํ•œ ์ •๋ณด๋“ค ํฌํ•จ
    • Access-Control-Request-Header : ์‹ค์ œ ์š”์ฒญ์˜ ์ถ”๊ฐ€ ํ—ค๋”
    • Access-Control-Request-Method : ์‹ค์ œ ์š”์ฒญ์˜ ๋ฉ”์†Œ๋“œ
  • Prefilight Response
    • Access-Control-Allow-Origin : ํ—ˆ๊ฐ€ ์ถœ์ฒ˜
    • Access-Control-Allow-Methods : ํ—ˆ๊ฐ€ ๋ฉ”์†Œ๋“œ
    • Access-Control-Allow-Headers : ํ—ˆ๊ฐ€ ํ—ค๋”
    • Access-Control-Max-Age: Prefilight ์‘๋‹ต ์บ์‹œ ์‹œ๊ฐ„

์‘๋‹ต ์‹œ

  • Prefilight Response์˜ ์‘๋‹ต ์ฝ”๋“œ๋Š” 200์ด์–ด์•ผ ํ•œ๋‹ค.
  • origin๊ณผ acess-control-allow-origin์ด ๋‹ค๋ฅด๋‹ค๋ฉด, ๋ณธ ์š”์ฒญ(์‹ค์ œ ์š”์ฒญ)์„ ๋ณด๋‚ด์ง€ ์•Š์Œ

image

2. ๋‹จ์ˆœ ์š”์ฒญ Simple Request

๋‹จ์ˆœ ์š”์ฒญ Simple Request๋ž€?

  • ์‚ฌ์ „ ์š”์ฒญ ์—†์ด, ๋ฐ”๋กœ ๋ณธ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • ๋‹จ, ์ œ์•ฝ์กฐ๊ฑด ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ณ„๋กœ ์—†์Šต๋‹ˆ๋‹ค.

๐Ÿ‘‰ ์กฐ๊ฑด

  • ๋ฉ”์†Œ๋“œ : GET, POST, HEAD
  • content-type
    • application/x-www-form-urlencoded
    • multipart/form-data
    • text
  • ํ—ค๋”
    • Accept, Accept-Language, Content-Language, Content-Type

3. ์ธ์ฆ(๋ณด์•ˆ) ์š”์ฒญ Credentialed Request

  • ์˜ต์…˜๊ฐ’์„ ํ†ตํ•ด ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์ธ์ง€ ํ™•์ธํ•˜๋Š” ์ ˆ์ฐจ๋ฅผ ๊ฑฐ์นจ

| ์˜ต์…˜ ๊ฐ’ | ์„ค๋ช… | | --- | --- | | Same-Origin | ๊ธฐ๋ณธ๊ฐ’, ๊ฐ™์€ ์ถœ์ฒ˜ ๊ฐ„ ์š”์ฒญ์—๋งŒ ์ธ์ฆ ์ •๋ณด๋ฅผ ๋‹ด์Œ | | Include | ๋ชจ๋“  ์š”์ฒญ์— ์ธ์ฆ ์ •๋ณด๋ฅผ ๋‹ด์Œ | | Omit | ๋ชจ๋“  ์š”์ฒญ์— ์ธ์ฆ ์ •๋ณด๋ฅผ ๋‹ด์ง€ ์•Š์Œ |

Credentialed Request๋ž€?

image

  • ์ธ์ฆ ๊ด€๋ จ ํ—ค๋”๋ฅผ ํฌํ•จํ•  ๋•Œ ์‚ฌ์šฉ

๐Ÿ‘‰ ๋‚ด์šฉ

  • credentials: include
    • ์ฟ ํ‚ค ๋˜๋Š” JWT ํ† ํฐ์„ ๋‹ด์•„์„œ ์„œ๋ฒ„์— ๋ณด๋‚ผ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

์ œ์•ฝ์‚ฌํ•ญ

  • Access-Control-Allow-Origin์—๋Š” *์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ๋ช…์‹œ์ ์ธ URL์ด์–ด์•ผ ํ•œ๋‹ค.
  • ์‘๋‹ต ํ—ค๋”์—๋Š” Access-control-allow-credentials: true๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.

CORS ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: Cross-Origin Resource Sharing

Cross-Origin Resource Sharing, ๊ต์ฐจ ์ถœ์ฒ˜ ์ž์› ๊ณต์œ 

๋ชจ๋“  ์ถœ์ฒ˜์˜ ์ž์›์„ ๋ฐ›์„ ๊ฒฝ์šฐ ๋ณด์•ˆ ์ƒ์˜ ์œ„ํ—˜์ด ์žˆ์œผ๋ฏ€๋กœ, ํŠน์ • ์ถœ์ฒ˜์—์„œ๋งŒ ์ž์›๋งŒ ๊ณต์œ ๋ฐ›๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

  1. Webpack Dev Server ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹ฑ (์šฐํšŒ)
    • ํ”„๋ก ํŠธ ์„œ๋ฒ„์—์„œ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ, url์„ ๋ณ€๊ฒฝํ•œ๋‹ค.
    • ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ๋งŒ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
  2. ์‘๋‹ต ํ—ค๋” ์„ค์ •
    • ํ”„๋ก ํŠธ์— ์‘๋‹ต์„ ๋‚ด๋ ค์ค„ ๋•Œ, ์˜ฌ๋ฐ”๋ฅธ Access-Control-Allow-Origin์„ ์„ธํŒ…ํ•ด์•ผ ํ•œ๋‹ค.
    • ์ง์ ‘ ํ—ค๋”์— ์„ค์ •์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
  3. ์Šคํ”„๋ง๋ถ€ํŠธ(์ž๋ฐ”) ์„ค์ •
    • ์„ค์ • ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ ย WebMvcConfigurer์„ ๊ตฌํ˜„ํ•˜๋ฉดย addCorsMappings๋ž€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CORS์˜ ์ถœ์ฒ˜ ๋ฐ ์„ค์ • ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ ˆํผ๋Ÿฐ์Šค :