๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป DEV/Network

[Network] CORS ๋ž€?

by vodkassi 2021. 6. 5.
728x90

โœจ CORS (์ •์ฑ…) ์ด๋ž€?

2009๋…„์— ๋“ฑ์žฅํ•œ ๋ณด์•ˆ ์ •์ฑ…์œผ๋กœ, Cross-Origin Resource Sharing ์˜ ์•ฝ์ž์ด๋‹ค.

์›น ์ƒํƒœ๊ณ„์—์„œ ๋‹ค๋ฅธ ์ถœ์ฒ˜๋กœ์˜ ๋ฆฌ์†Œ์„œ ์š”์ฒญ์„ ์ œํ•œํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ์ •์ฑ… ์ค‘ ํ•˜๋‚˜์ด๋‹ค (๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” SOP(Same-Origin Policy)์ด๋‹ค.)

์ ์ฐจ ์›น์—์„œ ๋‹ค๋ฅธ ์ถœ์ฒ˜์— ์žˆ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•˜๋Š” ์ผ์ด ํ”ํ•ด์ง€์ž, "๋ช‡ ๊ฐ€์ง€ ์˜ˆ์™ธ ์กฐํ•ญ์— ํ•ด๋‹นํ•˜๋Š” (===CORS ์ •์ฑ…์„ ์ง€ํ‚จ) ๋ฆฌ์†Œ์Šค ์š”์ฒญ"์— ํ•œํ•ด์„œ๋Š” ํ—ˆ์šฉํ•ด์ฃผ์ž๋Š” ์ •์ฑ…์ด ๋ฐ”๋กœ CORS ์ •์ฑ…์ด๋‹ค.

์ฆ‰, ์ •ํ•ด์ง„ ํ—ค๋”๋ฅผ ์ง€ํ‚จ ์š”์ฒญ์— ํ•œํ•ด์„œ๋Š” ๊ฐ™์€ ์ถœ์ฒ˜๊ฐ€ ์•„๋‹Œ url ๋ผ๋ฆฌ๋„ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

 

SOP๋ž€?

 

์ผ์ข…์˜ ๋ณด์•ˆ ์ •์ฑ…์œผ๋กœ, "๊ฐ™์€ ์ถœ์ฒ˜์—์„œ๋งŒ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค"๋Š” ๊ทœ์น™์„ ๊ฐ€์ง„ ์ •์ฑ…์ด๋‹ค.

 

Does it fulfill the SOP policy? (y/n)
  -> y : ๋ฆฌ์†Œ์Šค ์š”์ฒญ
  -> n : cors

Does it fulfill the CORS policy?
  -> y: ๋ฆฌ์†Œ์Šค ์š”์ฒญ
  -> n: ๋ฆฌ์†Œ์Šค ์š”์ฒญ ๋ถˆ๊ฐ€

 

 

"๊ฐ™์€" ์ถœ์ฒ˜๋ž€?

url ์˜ scheme, host, port ๊ฐ€ ๋™์ผํ•œ ๊ฒฝ์šฐ๋ฅผ ์ผ์ปซ๋Š”๋‹ค.

์œ„์˜ 3๊ฐ€์ง€๊ฐ€ ๊ฐ™๋‹ค๋ฉด query ๋‚˜ path ๊ฐ€ ๋‹ฌ๋ผ๋„ ๋™์ผํ•œ ์ถœ์ฒ˜๋กœ ์ธ์‹๋œ๋‹ค.

 

โœจ Access Control Scenarios

CORS ๊ฐ€ ์ž‘๋™ํ•˜๋Š” 3๊ฐ€์ง€ ๋ฐฉ์‹์ด๋‹ค.

 

โœจ Simple Requests(๊ฐ„๋‹จํ•œ ์š”์ฒญ): ๋‹ค์Œ ์กฐ๊ฑด๋“ค์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•œ๋‹ค.

- GET, HEAD, POST ๋ฉ”์„œ๋“œ ์š”์ฒญ 

- ์ž๋™์ ์œผ๋กœ ์„ค์ •๋˜๋Š” ํ—ค๋”์™€ Accept, Accept-Language, Content-Language, Content-Type ๋งŒ ์กด์žฌํ•˜๋Š” ์š”์ฒญ 

- Content-Type ๊ฐ€ application/x-www-form-urlencoded, multipart/form-data, text/plain ์ค‘ ํ•˜๋‚˜์— ์†ํ•˜๋Š” ์š”์ฒญ

- ๊ฐ„๋‹จํ•œ ์š”์ฒญ์˜ ๊ฒฝ์šฐ, ์„œ๋ฒ„์—์„œ Access-Control-Allow-Origin: ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•œ ์‘๋‹ต์„ ๋ณด๋‚ธ๋‹ค.

 

cors simple request

 

โœจ Preflight Requests(์‚ฌ์ „ ์š”์ฒญ)

๋ณธ ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์ „์— OPTIONS ํ—ค๋”๋ฅผ ๋‹จ ์š”์ฒญ์„ ๋จผ์ € ๋ณด๋‚ด, ์•ˆ์ „์„ฑ์„ ํ™•์ธํ•˜๋Š” ํ˜•ํƒœ์˜ ์š”์ฒญ์ด๋‹ค.

์ด ๊ฒฝ์šฐ, ์‹ค์ œ POST ์š”์ฒญ์ด ์•„๋‹Œ OPTIONS ์š”์ฒญ์— Access-Control-Request-* ํ—ค๋”๊ฐ€ ํฌํ•จ๋˜๋ฉฐ, ์ด๋Š” ์„œ๋ฒ„์—๊ฒŒ ์‹ค์ œ ์š”์ฒญ์ด ์ „๋‹ฌ๋  ๋•Œ ์ˆ˜ํ–‰ํ•  ๋ฉ”์„œ๋“œ์™€ ๊ธฐํƒ€ ๋‚ด์šฉ์„ ๋ช…์‹œํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

OPTIONS ๋ฉ”์„œ๋“œ๋Š” ์‹ค์ œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ์•ˆ์ „ํ•œ ๋ฉ”์„œ๋“œ์ด๋‹ค.

 

cors-preflight

 

โœจ Credential Requests(์ธ์ฆ์„ ์ด์šฉํ•˜๋Š” ์š”์ฒญ)

์š”์ฒญ ํ—ค๋”์— withCredentials์™€ ๊ฐ™์€ ํ—ค๋”๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ ์ฟ ํ‚ค๋ฅผ ๋™๋ฐ˜ํ•˜๊ฒŒ ๋˜์–ด, ์„œ๋ฒ„์˜ ์‘๋‹ต์— Access-Control-Allow-Credentials: true ํ—ค๋”๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ฒŒ ๋œ๋‹ค.

 

cors-credential

 

โœจ ๋งˆ๋ฌด๋ฆฌ

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

 

์ฐธ๊ณ ์ž๋ฃŒ

CORS๋Š” ์™œ ์ด๋ ‡๊ฒŒ ์šฐ๋ฆฌ๋ฅผ ํž˜๋“ค๊ฒŒ ํ•˜๋Š”๊ฑธ๊นŒ?

CORS(Cross-Origin Resource Sharing)์ด ๋‚˜์˜ค๊ฒŒ ๋œ ๋ฐฐ๊ฒฝ ์ด์•ผ๊ธฐ

MDN:CORS

๋Œ“๊ธ€