Skip to content
J119_์•ˆ๋ณ‘์›… edited this page Nov 14, 2021 · 1 revision

๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ  (Cross-Origin Resource Sharing, CORS)๋Š” ์ถ”๊ฐ€ HTTP ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ํ•œ ์ถœ์ฒ˜์—์„œ ์‹คํ–‰ ์ค‘์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ์„ ํƒํ•œ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋„๋ก ๋ธŒ๋ผ์šฐ์ €์—์„œ ์•Œ๋ ค์ฃผ๋Š” ์ฒด์ œ์ด๋‹ค.

๋ธŒ๋ผ์šฐ์ €๊ฐ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ณผ์ •์—์„œ, ๋„๋ฉ”์ธ ์ด๋ฆ„์ด ์„œ๋กœ ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ๊ฐ„์— api ์š”์ฒญ์„ ํ•  ๋•Œ CORS๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด CORS ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

CORS์˜ ๋™์ž‘

  1. HTTP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•  ๋•Œ, ์š”์ฒญ ํ—ค๋”(request ํ—ค๋”)์— Origin ํ•„๋“œ์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ์ถœ์ฒ˜๋ฅผ ๋‹ด์•„ ์ „์†กํ•œ๋‹ค.
    • ์œ„์— ์˜ˆ์‹œ์—์„œ๋Š” foo.com ์„ ๋‹ด์•„ ์ „์†กํ•œ๋‹ค
  2. ์„œ๋ฒ„์—์„œ๋Š” ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ํ•˜๋Š”๋ฐ, ์‘๋‹ต ํ—ค๋” (response header)์— Access-Control-Allow-Origin ์ด๋ผ๋Š” ๊ฐ’์— '์ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋œ ์ถœ์ฒ˜'๋ฅผ ๋‚ด๋ ค์ค€๋‹ค. ์ดํ›„ ์‘๋‹ต์„ ๋ฐ›์€ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ž์‹ ์ด ๋ณด๋ƒˆ๋˜ ์š”์ฒญ์˜ Origin๊ณผ ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ด์ค€ ์‘๋‹ต์˜ Access-Control-Allow-Origin์„ ๋น„๊ตํ•ด ๋ณธ ํ›„ ์ด ์‘๋‹ต์ด ์œ ์š”ํ•œ ์‘๋‹ต์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.
    • ์œ„์— ์˜ˆ์‹œ์—์„œ๋Š” Access-Control-Allow-Origin์— foo.com์„ ๋‹ด์•„์ค€๋‹ค.

request ํ—ค๋”์—๋Š” Origin์ด responseํ—ค๋”์—๋Š” Acess-Control-Allow-Originํ—ค๋”๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

CORS ๋™์ž‘์˜ ์‹œ๋‚˜๋ฆฌ์˜ค

Preflight Request

: ์š”์ฒญ์„ ํ•œ๋ฒˆ์— ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์˜ˆ๋น„ ์š”์ฒญ๊ณผ ๋ณธ ์š”์ฒญ์œผ๋กœ ๋‚˜๋ˆ„์–ด์„œ ์„œ๋ฒ„๋ฅผ ์ „์†กํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋งํ•œ๋‹ค. ๋ณธ ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์ „ ๋ฏธ๋ฆฌ ์˜ˆ๋น„๋กœ ๋ณด๋‚ด๋Š” ์š”์ฒญ์„ Preflight๋ผ๊ณ  ํ•˜๋ฉฐ, HTTP ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜์ธ OPTIONS ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  • ์˜ˆ๋น„ ์š”์ฒญ์„ ํ•จ์œผ๋กœ์จ ๋ณธ ์š”์ฒญ์— ๋Œ€ํ•œ ์•ˆ์ •์„ฑ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋น„ ์š”์ฒญ์œผ๋กœ ์„œ๋ฒ„๋Š” ํ˜„์žฌ ์ž์‹ ์ด ์–ด๋–ค ๊ฒƒ๋“ค์„ ํ—ˆ์šฉํ•˜๊ณ , ์–ด๋–ค ๊ฒƒ๋“ค(์ถœ์ฒ˜)๋ฅผ ๊ธˆ์ง€ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์‘๋‹ต ํ—ค๋”์— ๋‹ด์•„์„œ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ๋‹ค์‹œ ๋ณด๋‚ด์ค€๋‹ค.

Siple Request

Preflight ์š”์ฒญ๊ณผ๋Š” ๋‹ฌ๋ฆฌ, ์˜ˆ๋น„ ์š”์ฒญ์„ ๋ณด๋‚ด์ง€ ์•Š๊ณ , ์„œ๋ฒ„์—๊ฒŒ ๋ฐ”๋กœ ๋ณธ ์š”์ฒญ์„ ์ „์†กํ•œ๋‹ค

์ด๋•Œ ์„œ๋ฒ„์˜ ์‘๋‹ตํ•ด๋”์— Access-Control-Allow-Origin ๊ณผ ๊ฐ™์€ ๊ฐ’์„ ๋ณด๋‚ด์ฃผ๋ฉด ์ด๋•Œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ CORS ์ •์ฑ… ์œ„๋ฐ˜ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค

์œ„๋ฐ˜์—ฌ๋ถ€

  • ์š”์ฒญ์˜ ๋ฉ”์†Œ๋“œ๋Š” GET, HEAD, POST ์ค‘ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค
  • Accept,ย Accept-Language,ย Content-Language,ย Content-Type,ย DPR,ย Downlink,ย Save-Data,ย Viewport-Width,ย Widthย ์™ธ์˜ ๋‹ค๋ฅธ ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
  • ๋งŒ์•ฝย **Content-Type**๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š”ย application/x-www-form-urlencoded,ย multipart/form-data,ย **text/plain**๋งŒ ํ—ˆ์šฉ๋œ๋‹ค.

Credentialed Request

์ธ์ฆ๋œ ์š”์ฒญ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

๋‹ค๋ฅธ ์ถœ์ฒ˜ ๊ฐ„ ํ†ต์‹ ์˜ ์ข€ ๋” ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋น„๋™๊ธฐ ๋ฆฌ์†Œ์Šค ์š”์ฒญ API์ธย XMLHttpRequestย ๊ฐ์ฒด๋‚˜ย **fetch API**๋Š” ๋ณ„๋„์˜ ์˜ต์…˜ ์—†์ด ๋ธŒ๋ผ์šฐ์ €์˜ ์ฟ ํ‚ค ์ •๋ณด๋‚˜ ์ธ์ฆ๊ณผ ๊ด€๋ จ๋œ ํ—ค๋”๋ฅผ ํ•จ๋ถ€๋กœ ์š”์ฒญ์— ๋‹ด์ง€ ์•Š๋Š”๋‹ค. ์ด๋•Œ ์š”์ฒญ์— ์ธ์ฆ๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์˜ต์…˜์ด ๋ฐ”๋กœย credentialsย ์˜ต์…˜์ด๋‹ค.

credentials๋„ ์„ธ๊ฐ€์ง€ ์˜ต์…˜์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • same-originย : ๊ฐ™์€ ์ถœ์ฒ˜ ๊ฐ„ ์š”์ฒญ์—๋งŒ ์ธ์ฆ ์ •๋ณด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค.
  • includeย : ๋ชจ๋“  ์š”์ฒญ์— ์ธ์ฆ ์ •๋ณด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค.
  • omitย - : ๋ชจ๋“  ์š”์ฒญ์— ์ธ์ฆ ์ •๋ณด๋ฅผ ๋‹ด์ง€ ์•Š๋Š”๋‹ค.
๋‹ค๋ฅธ ์ถœ์ฒ˜ ์‚ฌ์ดํŠธ๋กœ๋ถ€ํ„ฐ ์ฟ ํ‚ค์™€ ๊ฐ™์€ ์ธ์ฆ์ •๋ณด๋ฅผ ํฌํ•จ์‹œํ‚ค๊ณ ์žํ•  ๋•Œ credentials: 'include' ์˜ต์…˜์„ ๋„ฃ์–ด์ค€๋‹ค. 

๋™์ž‘ ์กฐ๊ฑด

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

์ถœ์ฒ˜ :

https://velog.io/@pilyeooong/CORS๋ž€-๋ฌด์—‡์ธ๊ฐ€

https://zzossig.io/posts/web/what_is_cors/

๐Ÿ“– ๊ฐœ๋ฐœ๋ฌธ์„œ

๐Ÿšฅ ๊ทœ์น™

๐Ÿค” ์Šคํ”„๋ฆฐํŠธ ํšŒ์˜

๐Ÿ“” ํ•™์Šต

๐Ÿ•™ ๋ฐ์ผ๋ฆฌ ์Šคํฌ๋Ÿผ

๐Ÿ’ญ ํšŒ๊ณ ๋ก

๐Ÿ‘จโ€๐Ÿ‘ฆ ๋ฉ˜ํ† ๋ง

๋ฐ๋ชจ์˜์ƒ

Clone this wiki locally