CS ๊ณต๋ถ€ - front

[์›น] cors, Cross-origin resource sharing

Nuri-KSLV-II 2023. 1. 29. 17:53

๐Ÿ“Œ cors ๋ž€?

Cross-origin resource sharing, ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ  ์ •์ฑ…

 

cors ๊ฐœ๋…

- ๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ ๋ธŒ๋ผ์šฐ์ €๋“ค์ด ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์— ์š”์ฒญ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์ œํ•œํ•จ

- ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ ์ž์‹ ์˜ ์ถœ์ฒ˜์™€ ๋™์ผํ•œ ๋ฆฌ์†Œ์Šค๋งŒ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์Œ

- ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋ ค๋ฉด ๊ทธ ์ถœ์ฒ˜์—์„œ ์˜ฌ๋ฐ”๋ฅธ cors ํ—ค๋”๋ฅผ ํฌํ•จํ•œ ์‘๋‹ต์„ ๋ฐ˜ํ™˜

 

 

 

๐Ÿ“Œ ์ถœ์ฒ˜๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

origin ์ถœ์ฒ˜

- ํฌํŠธ๋ฒˆํ˜ธ๋Š” ์ƒ๋žต๋˜์–ด์žˆ์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ ํฌํŠธ๋ฒˆํ˜ธ๊นŒ์ง€ ๋ชจ๋‘ ์ผ์น˜ํ•ด์•ผ ๊ฐ™์€ ์ถœ์ฒ˜๋ผ๊ณ  ์ธ์ •(ex.https://google.com:443)

- ๊ฐ™์€ ์ถœ์ฒ˜ ๊ทœ์น™ : SOP(Same-Origin Policy)

- ์›น ํŠน์„ฑ ์ƒ ์œ„ ๊ทœ์น™์„ ์ง€ํ‚ค๊ธฐ ์–ด๋ ต๋‹ค๋ฉด, cors(๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ )๋ผ๋„ ์ง€ํ‚ค์ž

 

 

๐Ÿ“Œ cors ์ •์ฑ…

- ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™, ์„œ๋ฒ„๋Š” cors๋ฅผ ์œ„๋ฐ˜ํ•˜๋”๋ผ๋„ ์ •์ƒ์ ์œผ๋กœ ์‘๋‹ตํ•œ๋‹ค

 

[๋™์ž‘๊ณผ์ • - ์„œ๋กœ ๋‹ค๋ฅธ ์ถœ์ฒ˜๋ฅผ ๊ฐ€์ง„ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ณผ์ •] 

1. ํด๋ผ์ด์–ธํŠธ์—์„œ ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•  ๋•Œ http ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ

2. ๋ธŒ๋ผ์šฐ์ €๋Š” ์š”์ฒญ ํ—ค๋”์— origin์ด๋ผ๋Š” ํ•„๋“œ์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ์ถœ์ฒ˜๋ฅผ ๋‹ด์•„ ๋ณด๋ƒ„

3. ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์— ์‘๋‹ตํ•  ๋•Œ ์‘๋‹ตํ—ค๋”์˜ Access-Control-Allow-Origin ๊ฐ’์— '๋ฆฌ์†Œ์Šค๋ฅผ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋œ ์ถœ์ฒ˜' ๋ฅผ ๋‹ด์•„์„œ ์‘๋‹ต

4. ๋ธŒ๋ผ์šฐ์ €๋Š” ์ž์‹ ์ด ๋ณด๋ƒˆ๋˜ ์š”์ฒญ์˜ origin๊ณผ ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ด์ค€ ์‘๋‹ต์˜ Access-Control-Allow-Origin์„ ๋น„๊ตํ›„ ์œ ํšจ ์‘๋‹ต์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ๊ฒฐ์ •

 

[๋™์ž‘๋ฐฉ์‹1 - Preflight Request]

- ๊ฐ€์žฅ ์ผ๋ฐ˜์ 

- ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์š”์ฒญ์„ ์˜ˆ๋น„์š”์ฒญ(Preflight)๊ณผ ๋ณธ ์š”์ฒญ์œผ๋กœ ๋‚˜๋ˆ„์–ด์„œ ์„œ๋ฒ„๋กœ ๋ณด๋ƒ„

- ์˜ˆ๋น„ ์š”์ฒญ์—๋Š” OPTIONS ๋ฉ”์†Œ๋“œ๊ฐ€ ์‚ฌ์šฉ

- ์˜ˆ๋น„ ์š”์ฒญ์œผ๋กœ ๋ณธ ์š”์ฒญ ์ „์— ๋ธŒ๋ผ์šฐ์ € ์Šค์Šค๋กœ ์˜ˆ๋น„ ์š”์ฒญ์˜ ์•ˆ์ „์„ฑ์„ ํ™•์ธ

- ์˜ˆ๋น„ ์š”์ฒญ์—์„œ ๋ธŒ๋ผ์šฐ์ €๋Š” Access-Control-Request-Headers๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ณธ ์š”์ฒญ์—์„œ ์‚ฌ์šฉํ•  ํ—ค๋”(ex. content type)๋ฅผ ๋ฏธ๋ฆฌ ์•Œ๋ ค์ฃผ๊ฑฐ๋‚˜, Access-Control-Request-Method์—์„œ ์‚ฌ์šฉํ•  ๋ฉ”์†Œ๋“œ๋ฅผ ๋ฏธ๋ฆฌ ์„œ๋ฒ„์— ์•Œ๋ ค์คŒ

- ์‘๋‹ต ํ—ค๋”์— ์œ ํšจํ•œ Access-Control-Allow-Origin์ด ์กด์žฌํ•ด์•ผ cors ์ •์ฑ…์— ์œ„๋ฐ˜๋˜์ง€ ์•Š๋Š” ๊ฒƒ, ์š”์ฒญ์˜ ์„ฑ๊ณต ์—ฌ๋ถ€์™€ ๊ด€๋ จ ์—†์Œ

Preflight Request

 

 

[๋™์ž‘๋ฐฉ์‹2 - Simple Request]

- ์˜ˆ๋น„์š”์ฒญ์ด ์—†์Œ

- ๋‹จ, ์˜ˆ๋น„์š”์ฒญ์ด ์—†๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด์ด ์žˆ์Œ(๊ณต์‹ mdn ์ฐธ๊ณ )

Simple Request

 

[๋™์ž‘๋ฐฉ์‹3 - Credentialed Request]

- ์š”์ฒญ์— ์ธ์ฆ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

- ๋‹ค๋ฅธ ์ถœ์ฒ˜ ๊ฐ„ ํ†ต์‹ ์—์„œ ์ข€ ๋” ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๊ณ  ์‹ถ์„ ๋•Œ

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

์˜ต์…˜ ๊ฐ’ ์„ค๋ช…
same-origin(๋””ํดํŠธ) ๊ฐ™์€ ์ถœ์ฒ˜ ๊ฐ„ ์š”์ฒญ์—๋งŒ ์ธ์ฆ ์ •๋ณด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ์Œ
include ๋ชจ๋“  ์š”์ฒญ์— ์ธ์ฆ ์ •๋ณด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ์Œ
omit ๋ชจ๋“  ์š”์ฒญ์— ์ธ์ฆ ์ •๋ณด๋ฅผ ๋‹ด์ง€ ์•Š์Œ

- same-origin, include๋“ฑ์˜ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด Access-Control-Allow-Origin ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋” ๋นก๋นกํ•˜๊ฒŒ ์ธ์ฆ์„ ํ™•์ธ

- ๋ธŒ๋ผ์šฐ์ €๋Š” ์ธ์ฆ๋ชจ๋“œ๊ฐ€ include์ผ ๊ฒฝ์šฐ, ๋‘๊ฐ€์ง€ ์กฐ๊ฑด์ด ๋” ๋นก๋นกํ•˜๊ฒŒ ์ถ”๊ฐ€๋จ

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

 

 

์ฐธ๊ณ 

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

https://evan-moon.github.io/2020/05/21/about-cors/#%EC%9A%94%EC%B2%AD%EC%9D%84-img-%ED%83%9C%EA%B7%B8%EC%97%90-%EB%84%A3%EC%9C%BC%EB%A9%B4-%EC%96%B4%EB%96%A8%EA%B9%8C

 

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

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์›น ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ํ•œ๋ฒˆ์ฏค์€ ์–ป์–ด๋งž์•„ ๋ดค์„ ๋ฒ•ํ•œ ์ •์ฑ…์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ์‚ฌ์‹ค ์›น ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋ฉด CORS ์ •์ฑ… ์œ„๋ฐ˜์œผ๋กœ ์ธํ•ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ์€ ๊ต‰์žฅํžˆ ํ”ํ•ด์„œ

evan-moon.github.io