๐Ÿ”’ CORS๋ž€? ์™ธ๋ถ€ ์‚ฌ์ดํŠธ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

Diorยท2023๋…„ 8์›” 28์ผ
0

[Today I Learned]

๋ชฉ๋ก ๋ณด๊ธฐ
3/3
post-thumbnail

ํด๋ผ์ด์–ธํŠธ์—์„œ AWS S3 ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ๋„์ค‘ CORS ์—๋Ÿฌ๋ฅผ ๋งˆ์ฃผํ•˜๊ฒŒ ๋๋‹ค.
๋ฒ„ํ‚ท-๊ถŒํ•œ-CORS ์„ค์ •์„ ์ž‘์„ฑํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค. ์ด๋ฒˆ ๊ธฐํšŒ์— CORS์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.

CORS(Cross-Origin Resource Sharing)๋ž€?

๊ต์ฐจ ์ถœ์ฒ˜ ์ž์› ๊ณต์œ 

๋ง์ด ์–ด๋ ต์ง€๋งŒ ์‰ฝ๊ฒŒ ๋งํ•ด์„œ ๋‹ค๋ฅธ Origin(์ถœ์ฒ˜)์—์„œ ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
CORS ์—๋Ÿฌ๋Š” ์š”์ฒญ ๋ฐ›์€ Origin์˜ ์„œ๋ฒ„์—์„œ ์š”์ฒญ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•œ๋‹ค.

Origin์ด๋ž€?

URL์˜ ๊ตฌ์„ฑ ์š”์†Œ์ธ ํ”„๋กœํ† ์ฝœ, ๋„๋ฉ”์ธ, ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ํฌํ•จํ•œ ์ฃผ์†Œ

URL: https://www.example.com:8000

  • ํ”„๋กœํ† ์ฝœ = https
  • ๋„๋ฉ”์ธ = www.example.com
  • ํฌํŠธ ๋ฒˆํ˜ธ = 8000

์ฆ‰, Origin = ํฌ๋กœํ† ์ฝœ + ๋„๋ฉ”์ธ + ํฌํŠธ ๋ฒˆํ˜ธ


SOP(Same-Origin Policy)์™€ CORS

๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ…

์ž์‹ ๊ณผ ๋™์ผํ•œ Origin(์ถœ์ฒ˜)์—์„œ ๋กœ๋“œ๋œ ๋ฆฌ์†Œ์Šค์—๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ •์ฑ…
์›น ๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋ณธ ๋ณด์•ˆ ๋ชจ๋ธ๋กœ์„œ ์•…์˜์ ์ธ ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ์ถœ์ฒ˜์™€์˜ ๋ฐ์ดํ„ฐ ๊ณต์œ ๊ฐ€ ํ•„์š”ํ•ด์ง์— ๋”ฐ๋ผ SOP ์ •์ฑ…์„ ์™„ํ™”ํ•œ ๊ฒŒ CORS์ด๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด,
SOP = A Origin์—์„œ๋Š” ๊ฐ™์€ A Origin๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•œ๋‹ค.
CORS = A Origin์—์„œ B Origin๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•œ๋‹ค.


์„œ๋ฒ„ ์ธก์—์„œ์˜ CORS ์„ค์ •

HTTP ์‘๋‹ต ํ—ค๋”๋ฅผ ์„œ๋ฒ„ ์ธก์—์„œ๋Š” ํŠน์ • Origin(์ถœ์ฒ˜)์— ๋Œ€ํ•œ ์š”์ฒญ์„ ํ—ˆ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋ฒ„์˜ ์‘๋‹ต ํ—ค๋”์— Access-Control-Allow-Origin์ด๋ผ๋Š” ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ํ—ˆ์šฉ๋œ Origin์„ ๋ช…์‹œํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด

Access-Control-Allow-Origin: https://www.allowed-origin.com

์ด๋ ‡๊ฒŒ ๋ช…์‹œํ•˜๋ฉด ์„œ๋ฒ„๋Š” https://www.allowed-origin.com์ด๋ผ๋Š” Origin์˜ CORS๋ฅผ ํ—ˆ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.
*(์™€์ผ๋“œ์นด๋“œ)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  Origin๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

Django ์—์„œ๋Š” django-cors-headers ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ณ 
AWS S3์—์„œ๋Š” ๋ฒ„ํ‚ท ์ •์ฑ…์—์„œ CORS๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ฐ ์–ธ์–ด, ํ”„๋ ˆ์ž„์›Œํฌ์— ๋งž๊ฒŒ CORS๋ฅผ ์„ค์ •ํ•˜์ž.

CORS ๊ด€๋ จ ํ—ค๋”

์ถ”๊ฐ€์ ์œผ๋กœ Access-Control-Allow-Origin๋ฟ๋งŒ ์•„๋‹ˆ๋ผ CORS ๊ด€๋ จ ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ†ต์‹ ์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Access-Control-Allow-Methods: ํ—ˆ์šฉํ•˜๋Š” HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์ •ํ•œ๋‹ค.
  • Access-Control-Allow-Headers: ํ—ˆ์šฉํ•˜๋Š” ์š”์ฒญ ํ—ค๋”๋ฅผ ์ง€์ •ํ•œ๋‹ค.
  • Access-Control-Allow-Credentials: ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ํ—ˆ์šฉํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•œ๋‹ค.
  • Access-Control-Expose-Headers: ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ์‘๋‹ต ํ—ค๋”๋ฅผ ์ง€์ •ํ•œ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ์˜ CORS ์ฒ˜๋ฆฌ

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

๊ทธ๋Ÿฌ๋‚˜ CORS ๊ด€๋ จ ํŠน์ • ์š”์ฒญ์„ ๋ณด๋‚ด๊ฑฐ๋‚˜ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋•Œ, Fetch API๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
์ถ”๊ฐ€์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” CORS ํ™•์ธ์„ ์œ„ํ•ด Preflight ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

Preflight ์š”์ฒญ

์‹ค์ œ ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์ „, ์„œ๋ฒ„์—์„œ ํ•ด๋‹น ์š”์ฒญ์„ ํ—ˆ์šฉํ•˜๋Š”์ง€ ํ™•์ธ์„ ์œ„ํ•œ ์‚ฌ์ „ ์š”์ฒญ(HTTP)

OPTIONS ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
์‚ฌ์ „์— CORS๋ฅผ ์ค€์ˆ˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ™„ P.S.

CORS ๊ตฌ์„ฑ์—์„œ *(์™€์ผ๋“œ์นด๋“œ)๋Š” ๋ณด์•ˆ์ƒ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ธฐ์— ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
CORS ์—๋Ÿฌ ์–ด๋ ค์šธ ๊ฑฐ ํ•˜๋‚˜ ์—†๋‹ค.

๐Ÿ™‡๐Ÿปโ€ ์ž˜๋ชป๋œ ์ •๋ณด๋Š” ๋Œ“๊ธ€์„ ํ†ตํ•ด ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

profile
Focus on growth rather than material

0๊ฐœ์˜ ๋Œ“๊ธ€