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๊ฐ ์์ผ๋ฉด ์น๋ธ๋ผ์ฐ์ ๊ฐ ํด๋น ์์ฒญ์ ์ฐจ๋จํ๋ค.
- ๊ฐ์ Origin
- ๋ค๋ฅธ ์ค๋ฆฌ์ง์์ ํด๋น CORS ํค๋๋ฅผ ์ฌ์ฉํ ์์ฒญ์ ํ์ฉํ์ง ์๋ ํ,
์์ฒญ์ด ์ํ๋ ์ ์๋ค - CORS ์์ฒญ ํค๋์ ์ด๋ฆ์
Access-Control-Allow-Origin
์ด๋ผ๊ณ ํ๋ค.
CORS - Diagram
์น ๋ธ๋ผ์ฐ์ ๊ฐ ์ฒซ ๋ฒ์งธ ์น ์๋ฒ๋ฅผ ๋ฐฉ๋ฌธํ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฌธ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ 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
- Client๊ฐ Website๋ก ํ์ฑํ๋ S3 Bucket์ ๋ํด Cross Origin Request๋ฅผ ํ๋ ๊ฒฝ์ฐ ์ฌ๋ฐ๋ฅธ CORS Header๋ฅผ ํ์ฑํํ ํ์๊ฐ ์๋ค.
- AWS ์ํ์ ์์ฃผ ์ถ์ ๋๋ ํญ๋ชฉ์ด๋ค.
- ์ฐ๋ฆฌ๋ ํน์ ์ค๋ฆฌ์ง or ์ ์ฒด ์ค๋ฆฌ์ง์ ๋ํ์ฌ ์์ฒญ์ ํ์ฉํ ์ ์๋ค.
- ์น ๋ธ๋ผ์ฐ์ ๋ ๋ฒํท์์ HTML ํ์ผ์ ๊ฐ์ง๊ณ ์จ๋ค.
- ์ด๋ ๋ฒํท์ ์น์ฌ์ดํธ๋ก ํ์ฑํ๋ ์ํ
- ๋๋ฒ์งธ ๋ฒํท์ ๊ต์ฐจ ์ค๋ฆฌ์ง ๋ฒํท์ด ๋๋ค.
- ์ด ๋ฒํท ๋ํ ์น์ฌ์ดํธ๋ก ํ์ฑํ๋ ์ํ์ด๋ฉฐ ๋์ผํ ํ์ผ์ ๊ฐ์ง๊ณ ์๋ค
- ๋ฒํท์ GET index.html ์ ์ ์กํ๋ฉด ์น์ฌ์ดํธ๊ฐ index.html ์ ์ ์กํด ์ค ๊ฒ์ด๋ค.
- ๊ทธ index.html ํ์ผ์ ๋ค๋ฅธ ์ค๋ฆฌ์ง์ ์๋ ๋ ๋ค๋ฅธ ํ์ผ์ ์ํด GET ๋์์ด ํ์ํ๋ค๊ณ ์์ฒญํ๋ค.
- ํด๋น ๋ฒํท์ด ์ฌ๋ฐ๋ฅธ CORS Header๋ก ๊ตฌ์ฑ๋์ด์์ ๊ฒฝ์ฐ ์น๋ธ๋ผ์ฐ์ ๊ฐ ์์ฒญ์ ๋ณด๋ผ ์ ์์ผ๋,
์๋ ๊ฒฝ์ฐ์๋ ์์ฒญ์ด ๋ถ๊ฐ๋ฅํ๋ค. - ๋ฐ๋ก ์ด๊ฒ์ด 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
}
]
๋๊ธ๋จ๊ธฐ๊ธฐ