๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ŒCS/Web

[Web] CORS(Cross-Origin Resource Sharing)

by dar0m! 2021. 4. 18.

๊ฐœ๋…

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

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

์ถœ์ฒ˜๋ž€?

๋„๋ฉ”์ธ(ํ˜ธ์ŠคํŠธ), ํ”„๋กœํ† ์ฝœ, ํฌํŠธ๊ฐ€ ๋‹ค๋ฅผ ๋•Œ ์ถœ์ฒ˜๊ฐ€ ๋‹ค๋ฅด๋‹ค๊ณ  ๋งํ•˜๋ฉฐ, ์ด๋•Œ ๊ต์ฐจ ์ถœ์ฒ˜ HTTP ์š”์ฒญ์„ ์‹คํ–‰ํ•œ๋‹ค. ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ž์‹ ์˜ ์ถœ์ฒ˜์™€ ๋™์ผํ•œ ๋ฆฌ์†Œ์Šค๋งŒ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋ ค๋ฉด ๊ทธ ์ถœ์ฒ˜์—์„œ ์˜ฌ๋ฐ”๋ฅธ CORS ํ—ค๋”๋ฅผ ํฌํ•จํ•œ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

https://developer.mozilla.org/ko/docs/Web/Security/Same-origin_policy

ํ•ด๊ฒฐ(ํ—ˆ์šฉ) ๋ฐฉ๋ฒ•

XMLHttpRequest์™€ Fetch API๋Š” ๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ…์„ ๋”ฐ๋ฅธ๋‹ค. ์ฆ‰, ์ด API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ž์‹ ์˜ ์ถœ์ฒ˜์™€ ๋™์ผํ•œ ๋ฆฌ์†Œ์Šค๋งŒ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋ ค๋ฉด ๊ทธ ์ถœ์ฒ˜์—์„œ ์˜ฌ๋ฐ”๋ฅธ CORS ํ—ค๋”๋ฅผ ํฌํ•จํ•œ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ „์ œ

https://foo.example ์˜ ์›น ์ปจํ…์ธ ๊ฐ€  https://bar.other ๋„๋ฉ”์ธ์˜ ์ปจํ…์ธ ๋ฅผ ํ˜ธ์ถœํ•˜๊ธธ ์›ํ•œ๋‹ค. (foo → bar)

๋ฐฉ๋ฒ• 1(๋‹จ์ˆœ ์š”์ฒญ)

Simple requests (์ถœ์ฒ˜ : https://developer.mozilla.org/ko/docs/Web/HTTP/CORS)

ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ„์— ๊ฐ„๋‹จํ•œ ํ†ต์‹ ์„ ํ•˜๊ณ , CORS ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ถŒํ•œ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์ ‘๊ทผ ์ œ์–ด ํ”„๋กœํ† ์ฝœ์€ Origin ํ—ค๋”์™€ Access-Control-Allow-Origin ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๊ฒฝ์šฐ ์„œ๋ฒ„๋Š” Access-Control-Allow-Origin: *, ์œผ๋กœ ์‘๋‹ตํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋Š” ๋ชจ๋“  ๋„๋ฉ”์ธ์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.

https://bar.other  ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž๊ฐ€   ์˜ค์ง https://foo.example ์˜ ์š”์ฒญ๋งŒ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์ „์†กํ•œ๋‹ค. Access-Control-Allow-Origin: https://foo.example

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ https://foo.example ์ด์™ธ์˜ ๋„๋ฉ”์ธ์€ corss-site ๋ฐฉ์‹์œผ๋กœ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜๋ ค๋ฉด, Access-Control-Allow-Origin ํ—ค๋”์—๋Š” ์š”์ฒญ์˜ Origin ํ—ค๋”์—์„œ ์ „์†ก๋œ ๊ฐ’์ด ํฌํ•จ๋˜์–ด์•ผ ํ•œ๋‹ค.

๋ฐฉ๋ฒ• 2(ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ ์š”์ฒญ)

preflighted requests (์ถœ์ฒ˜ : https://developer.mozilla.org/ko/docs/Web/HTTP/CORS)

๋จผ์ € OPTIONS ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ ๋ฆฌ์†Œ์Šค๋กœ HTTP ์š”์ฒญ์„ ๋ณด๋‚ด ์‹ค์ œ ์š”์ฒญ์ด ์ „์†กํ•˜๊ธฐ์— ์•ˆ์ „ํ•œ์ง€ ํ™•์ธํ•œ๋‹ค. (๋ฏธ๋ฆฌ ์ „์†กํ•˜์—ฌ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•)

  • OPTIONS ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์‘๋‹ต์— Allow ํ—ค๋”๊ฐ€ ํฌํ•จ๋˜์–ด ์˜ค๋Š”๋ฐ ์ด๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์—์„œ ํ—ˆ์šฉ๋˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Access-Control-Request-Method ํ—ค๋”๋Š” preflight request์˜ ์ผ๋ถ€๋กœ, ์‹ค์ œ ์š”์ฒญ์„ ์ „์†กํ•  ๋•Œ POST ๋ฉ”์„œ๋“œ๋กœ ์ „์†ก๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ค€๋‹ค. 
Access-Control-Request-Headers ํ—ค๋”๋Š” ์‹ค์ œ ์š”์ฒญ์„ ์ „์†ก ํ•  ๋•Œ X-PINGOTHER ์™€ Content-Type ์‚ฌ์šฉ์ž ์ •์˜ ํ—ค๋”์™€ ํ•จ๊ป˜ ์ „์†ก๋œ๋‹ค๋Š” ๊ฒƒ์„ ์„œ๋ฒ„์— ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ์ด์ œ ์„œ๋ฒ„๋Š” ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ ์š”์ฒญ์„ ์ˆ˜๋ฝํ• ์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

preflight request๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์‹ค์ œ ์š”์ฒญ์„ ์ „์†กํ•œ๋‹ค.

๋ฐฉ๋ฒ• 3(์ธ์ฆ์ •๋ณด๋ฅผ ํฌํ•จํ•œ ์š”์ฒญ)

credentialed requests (์ถœ์ฒ˜ : https://developer.mozilla.org/ko/docs/Web/HTTP/CORS)

 credentialed requests๋Š” HTTP cookies ์™€ HTTP Authentication ์ •๋ณด๋ฅผ ์ธ์‹ํ•œ๋‹ค.

์š”์ฒญ์—๋Š” http://bar.other์˜ ์ปจํ…์ธ ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์ฟ ํ‚ค๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ Access-Control-Allow-Credentials: true ๋กœ ์‘๋‹ตํ•˜์ง€ ์•Š์œผ๋ฉด, ์‘๋‹ต์€ ๋ฌด์‹œ๋˜๊ณ  ์›น ์ปจํ…์ธ ๋Š” ์ œ๊ณต๋˜์ง€ ์•Š๋Š”๋‹ค.

credentialed request ์— ์‘๋‹ตํ•  ๋•Œ ์„œ๋ฒ„๋Š” Access-Control-Allow-Origin ํ—ค๋” "*" ์™€์ผ๋“œ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹ ์— ๋ฐ˜๋“œ์‹œ ์— ๊ฐ’์„ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.

์œ„ ์š”์ฒญ์€ Access-Control-Allow-Origin ํ—ค๋”๊ฐ€ "*" ์™€์ผ๋“œ ์นด๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ "http://foo.example" ๋ณธ๋ž˜ ์ฃผ์†Œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž๊ฒฉ์ฆ๋ช… ์ธ์‹ ์ปจํ…์ธ ๋Š” ์›น ํ˜ธ์ถœ ์ปจํ…์ธ ๋กœ ๋ฆฌํ„ด๋œ๋‹ค.

 

์ฐธ๊ณ 

 

'๐Ÿ“ŒCS > Web' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

XSS(Cross-site Scripting) ๊ณต๊ฒฉ  (0) 2021.04.25
[Web] param vs query vs body  (2) 2021.04.18
[Web] HTTP, HTTPS, HTTP ๋ฒ„์ „  (1) 2021.04.08
[Web] ์ฟ ํ‚ค์™€ ์„ธ์…˜  (0) 2021.04.04
[Web] REST & RESTful  (0) 2021.04.03

๋Œ“๊ธ€