S3 - CORS

CORS (Cross Origin Resource Sharing)

๊ต์ฐจ ์˜ค๋ฆฌ์ง„ ๋ฆฌ์†Œ์Šค ๊ณต์œ 

  • ์˜ค๋ฆฌ์ง„์ด๋ž€?
    • ์ฒด๊ณ„, ์ฆ‰ ํ”„๋กœํ† ์ฝœ์ด์ž ํ˜ธ์ŠคํŠธ, ๋„๋ฉ”์ธ, ๊ทธ๋ฆฌ๊ณ  ํฌํŠธ ์ž…๋‹ˆ๋‹ค.
    • ex) https://www.example.com ์ด๋ž€ ์‚ฌ์ดํŠธ๋Š”
      • ์ฒด๊ณ„ HTTPS
      • ํ˜ธ์ŠคํŠธ www.example.com
      • ํฌํŠธ 443์ธ ์˜ค๋ฆฌ์ง„์ž…๋‹ˆ๋‹ค. (HTTP ๋Š” port: 80)
  • CORS: ๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ค๋ฅธ ์˜ค๋ฆฌ์ง„์—์„œ ์–ป์„ ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋Š” ์˜๋ฏธ
  • ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ณด์•ˆ์œผ๋กœ CORS ๋ฅผ ๊ฐ–์ถ”๊ณ  ์žˆ๊ณ , ์šฐ๋ฆฌ๋“ค์ด ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ฐฉ๋ฌธํ–ˆ์„ ๋•Œ
    ๋‹ค๋ฅธ ์˜ค๋ฆฌ์ง„์ด ํ—ˆ๋ฝํ•  ๋•Œ์—๋งŒ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ๋ฝํ•˜๋Š” ์„ค์ •์ž…๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜ ๋ณด์•ˆ์ด๋‹ค.
  • ๊ฐ™์€ ์˜ค๋ฆฌ์ง„๊ณผ ๋‹ค๋ฅธ ์˜ค๋ฆฌ์ง„์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ผ๊นŒ?
    • ๊ฐ™์€ Origin
      • http://example.com/app1 & http://example.com/app2
      • ์ฒซ๋ฒˆ์งธ URL ์—์„œ ๋‘๋ฒˆ ์งธ URL ๋กœ ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ„ ์š”์ฒญ์ด ๊ฐ€๋Šฅ
    • ๋‹ค๋ฅธ Origin
      • http://www.example.com & http://other.example.com
      • ์ฒซ๋ฒˆ์งธ URL ์—์„œ ๋‘๋ฒˆ ์งธ URL๋กœ ์š”์ฒญ์„ ํ•  ๊ฒฝ์šฐ โ€œ๊ต์ฐจ ์˜ค๋ฆฌ์ง„ ์š”์ฒญโ€ ์ด๋ผ๊ณ  ํ•œ๋‹ค.
      • ์˜ฌ๋ฐ”๋ฅธ CORS Header๊ฐ€ ์—†์œผ๋ฉด ์›น๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ•ด๋‹น ์š”์ฒญ์„ ์ฐจ๋‹จํ•œ๋‹ค.
  • ๋‹ค๋ฅธ ์˜ค๋ฆฌ์ง„์—์„œ ํ•ด๋‹น CORS ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•œ ์š”์ฒญ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ,
    ์š”์ฒญ์ด ์ˆ˜ํ–‰๋  ์ˆ˜ ์—†๋‹ค
  • CORS ์š”์ฒญ ํ—ค๋”์˜ ์ด๋ฆ„์€ Access-Control-Allow-Origin ์ด๋ผ๊ณ  ํ•œ๋‹ค.

CORS - Diagram

image-20220731190516161

์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฒซ ๋ฒˆ์งธ ์›น ์„œ๋ฒ„๋ฅผ ๋ฐฉ๋ฌธํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฌธ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ Origin ์ด๋ผ๊ณ  ํ•˜์ž.
https://www.example.com๋กœ ์ด ์›น ์„œ๋ฒ„๋ฅผ ๋ถˆ๋Ÿฌ ๋ณธ๋‹ค. ์ด์ œ ๋‘ ๋ฒˆ์งธ ์›น ์„œ๋ฒ„๋Š” โ€œ๊ต์ฐจ ์˜ค๋ฆฌ์ง„โ€์ด ๋œ๋‹ค.
https://www.other.com ์œผ๋กœ URL์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฒซ๋ฒˆ์งธ origin์„ ๋ฐฉ๋ฌธํ–ˆ์œผ๋‹ˆ, ์ด์ œ ์ด ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” origin์—์„œ ์—…๋กœ๋“œ๋œ ํŒŒ์ผ์— ๋Œ€ํ•œ ์š”์ฒญ์„
๊ต์ฐจ ์˜ค๋ฆฌ์ง„์—์„œ ๋ฐœ์ƒ์‹œ์ผœ์•ผ ํ•œ๋‹ค. ์ด๋•Œ ํ•ด๋‹น ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” preflight request(์‚ฌ์ „ ์š”์ฒญ)์„ ๋ณด๋‚ด๊ฒŒ ๋œ๋‹ค.
์ด ์‚ฌ์ „ ์š”์ฒญ์€ Cross Origin์—๊ฒŒ ์š”์ฒญ์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ์ง€๋ฅผ ๋ฌป๋Š”๋‹ค.

โ€œCross Origin์•„, ์›น์‚ฌ์ดํŠธ https://example.com์—์„œ ๋‚˜๋ฅผ ์ „์†กํ•˜๋ ค ํ•˜๋Š”๋ฐ, ๋‹ˆ ์›น์‚ฌ์ดํŠธ์— ์š”์ฒญ์„ ๋ณด๋‚ด๋„ ๋ ๊นŒ?โ€ ๋ผ๊ณ  ๋ฌป๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๋•Œ, Cross Origin์ด โ€œ๊ทธ๋Ÿผ ์ด๋ ‡๊ฒŒ ํ•ดโ€ ํ•˜๊ณ  Access-Contorl-Allow-Origin์„ ํ†ตํ•ด ํ•ด๋‹น ์›น์‚ฌ์ดํŠธ๊ฐ€ ํ—ˆ์šฉ๋˜๋Š”์ง€๋ฅผ ํŒ๋‹จํ•œ๋‹ค. ์œ„ ๊ทธ๋ฆผ์—์— ์ดˆ๋ก์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋œ ๋ฐ”์™€ ๊ฐ™์ด ์˜ค๋ฆฌ์ง„์ด ์ผ์น˜ํ•˜๋ฏ€๋กœ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.
์Šน์ธ๋œ Methods๋Š” GET/PUT/DELETE ๊ฐ€ ๋˜๋ฏ€๋กœ, ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜, ์‚ญ์ œ, ์—…๋ฐ์ดํŠธ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ต์ฐจ ์˜ค๋ฆฌ์ง„์œผ๋กœ ์›น๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•ž์„œ ๋งํ•œ ๋™์ž‘์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š”๊ฒƒ์ด๋‹ค. ์ด๋ฅผ CORS Methods๋ผ๊ณ  ํ•˜๋ฉฐ ์ด์ œ ์›น์‚ฌ์ดํŠธ๊ฐ€ ํ•ด๋‹น ๋™์ž‘์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์œผ๋‹ˆ ๊ต์ฐจ ์˜ค๋ฆฌ์ง„ URL์— ๋Œ€ํ•œ GET๋„ ๊ฐ€๋Šฅํ•œ ์…ˆ์ด๋‹ค. ์ด์ „์— ์ „์†ก๋ฐ›์€ CORS Header๊ฐ€ ์›น ๋ธŒ๋ผ์šฐ์ €์˜ ํ•ด๋‹น ์š”์ฒญ์„ ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

S3 CORS

image-20220731191642361

  • Client๊ฐ€ Website๋กœ ํ™œ์„ฑํ™”๋œ S3 Bucket์— ๋Œ€ํ•ด Cross Origin Request๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ ์˜ฌ๋ฐ”๋ฅธ CORS Header๋ฅผ ํ™œ์„ฑํ™”ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.
  • AWS ์‹œํ—˜์— ์ž์ฃผ ์ถœ์ œ๋˜๋Š” ํ•ญ๋ชฉ์ด๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ํŠน์ • ์˜ค๋ฆฌ์ง„ or ์ „์ฒด ์˜ค๋ฆฌ์ง„์— ๋Œ€ํ•˜์—ฌ ์š”์ฒญ์„ ํ—ˆ์šฉํ• ์ˆ˜ ์žˆ๋‹ค.
  1. ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ฒ„ํ‚ท์—์„œ HTML ํŒŒ์ผ์„ ๊ฐ€์ง€๊ณ  ์˜จ๋‹ค.
    • ์ด๋•Œ ๋ฒ„ํ‚ท์€ ์›น์‚ฌ์ดํŠธ๋กœ ํ™œ์„ฑํ™”๋œ ์ƒํƒœ
  2. ๋‘๋ฒˆ์งธ ๋ฒ„ํ‚ท์€ ๊ต์ฐจ ์˜ค๋ฆฌ์ง„ ๋ฒ„ํ‚ท์ด ๋œ๋‹ค.
    • ์ด ๋ฒ„ํ‚ท ๋˜ํ•œ ์›น์‚ฌ์ดํŠธ๋กœ ํ™œ์„ฑํ™”๋œ ์ƒํƒœ์ด๋ฉฐ ๋™์ผํ•œ ํŒŒ์ผ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค
  3. ๋ฒ„ํ‚ท์— GET index.html ์„ ์ „์†กํ•˜๋ฉด ์›น์‚ฌ์ดํŠธ๊ฐ€ index.html ์„ ์ „์†กํ•ด ์ค„ ๊ฒƒ์ด๋‹ค.
  4. ๊ทธ index.html ํŒŒ์ผ์€ ๋‹ค๋ฅธ ์˜ค๋ฆฌ์ง„์— ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ํŒŒ์ผ์„ ์œ„ํ•ด GET ๋™์ž‘์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์š”์ฒญํ•œ๋‹ค.
  5. ํ•ด๋‹น ๋ฒ„ํ‚ท์ด ์˜ฌ๋ฐ”๋ฅธ CORS Header๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ์„ ๊ฒฝ์šฐ ์›น๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์œผ๋‚˜,
    ์•„๋‹ ๊ฒฝ์šฐ์—๋Š” ์š”์ฒญ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  6. ๋ฐ”๋กœ ์ด๊ฒƒ์ด CORS ์˜ ๋ชฉ์ ์ด๋‹ค.

์—ฌ๊ธฐ์„œ ๋ณด์ด๋Š” ๋ฐ”์™€ ๊ฐ™์ด CORS Header๋Š” ์ฒซ ๋ฒˆ์งธ ์˜ค๋ฆฌ์ง„ ๋ฒ„ํ‚ท์ด ์•„๋‹Œ ๊ต์ฐจ ์˜ค๋ฆฌ์ง„ ๋ฒ„ํ‚ท์— ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•œ๋‹ค.

  • ๋‘๋ฒˆ์งธ ๋ฒ„ํ‚ท, ์ฆ‰ Cross Origin ์—์„œ ์„ค์ •์—์„œ CORS Json ์„ค์ •์œผ๋กœ ์ฒซ๋ฒˆ์งธ ์˜ค๋ฆฌ์ง„ URL ์„ ๋“ฑ๋กํ•ด์ค˜์•ผํ•œ๋‹ค.
[
    {
        "AllowedHeaders": [
            "Authorization"
        ],
        "AllowedMethods": [
            "GET"
        ],
        "AllowedOrigins": [
          	# ์ด๊ณณ์—๋‹ค๊ฐ€ Origin URL ์„ ๊ธฐ์ž…ํ•ด์ฃผ๋ฉด ๋˜๊ณ  ๋งˆ์ง€๋ง‰ / ๋Š” ์ ์ง€ ์•Š๋Š”๋‹ค.
            "<url of first bucket with http://...without slash at the end>"
        ],
        "ExposeHeaders": [],
        "MaxAgeSeconds": 3000
    }
]

ํƒœ๊ทธ: , ,

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ:

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ