๋ฐฐ๊ฒฝ ์ง์
SOP(Same Origin Policy)
- ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํํ๋ ๋ณด์ ๋ฐฉ์
์ SOP?
- CSRF Attack ๋๋ฌธ!
- ์ฌ์ฉ์๋ ์ธ์ฆ ํ ํฐ์ ๊ฐ์ง๊ณ ์๋ ์ํ
- ํด์ปค๊ฐ ๋ง๋ ์ฃผ์๋ก ์ด๋ํ๋๋ฐ, ์ฌ๊ธฐ๋ค ํด์ปค๋ ์ ์์ ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์
- ํด์ปค๋ ์ธ์ฆ ํ ํฐ์ ๊ฐ์ง๊ณ ์ ์์ ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ ์์
- ๋ง์ฝ ์ก๊ธ์ด๋ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ๊ฑด๋๋ฆด ์ ๊ต์ฅํ ์ํ
์ฌ๊ธฐ์ SOP๊ฐ ์๋ ฅ์ ๋ฐํ
- ์น์ฌ์ดํธ ์ ์ฅ์์๋ ์์ ๊ณผ ๋ค๋ฅธ ์ถ์ฒ๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ ์ ์์ฒญ์ ๋ฐ์ ์ ์๋ค๊ณ ํ๋จ
์ถ์ฒ(Origin)๋?
- Protocol, Host, Port ์ธ๊ฐ์ง๊ฐ ๊ฐ์์ผ ๊ฐ์ ์ถ์ฒ๋ผ๊ณ ํ๋จ
- ์ฐธ๊ณ ๋ก ์ธํฐ๋ท ์ต์คํ๋ก์ด๋ ์ถ์ฒํ๋จ์ Port๊ฐ ํฌํจ๋์ง ์์
๐ค ๊ทธ๋ฌ๋ฉด ๋ค๋ฅธ ์ถ์ฒ ๋ฆฌ์์ค๊ฐ ํ์ํ๋ฉด ์ด๋ป๊ฒํด??
CORS!!
CORS๋?
๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (Cross-Origin Resource Sharing, CORS)๋ ์ถ๊ฐ HTTP ํค๋๋ฅผ ์ฌ์ฉํ์ฌ, ํ ์ถ์ฒ์์ ์คํ์ค์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค๋ฅธ ์ถ์ฒ์ ์ ํํ ์์์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋๋ก ๋ธ๋ผ์ฐ์ ์ ์๋ ค์ฃผ๋ ์ฒด์ ์ ๋๋ค. - MOZILLA
CORS ์ ๊ทผ์ ์ด ์๋๋ฆฌ์ค
๋จ์ ์์ฒญ (Simple Request)
- Preflight ์์ฒญ ์์ด ๋ฐ๋ก ์์ฒญ
์กฐ๊ฑด์ ๋ชจ๋ ๋ง์กฑํด์ผ ํจ
- ๋ฉ์๋๋ ์๋๋ง ํ์ฉ
- GET, POST, HEAD
- Content-Type์ ์๋๋ง ํ์ฉ
- application/x-www-form-urlencoded
- multipart/form-data
- test/plain
- Header๋ ์๋๋ง ํ์ฉ
- Accept
- Accept-Language
- Content-Language
- Content-Type
ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ (Preflight Request)
- ์ฝ๊ฒ ๋งํ์๋ฉด ์ฌ์ ํ์ธ ์์
- OPTIONS ๋ฉ์๋๋ฅผ ํตํด ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค์ ์์ฒญ์ด ๊ฐ๋ฅํ์ง ํ์ธํ๋ ์์
- ์์ฒญ์ด ๊ฐ๋ฅํ๋ฉด ์ค์ ์์ฒญ(Actual Request)์ ๋ณด๋
- ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ ์์ฒญ์ ๋ณด๋
- ์๋ฒ๋ ์ด์ ์๋ต
- ๋ง์ฝ ์ด ์์ฒญ์ด ๊ฑฐ๋ถ๋๋ค๋ฉด Actual Request๋ ๋ณด๋ด์ง ์์
Preflight Request ํฌ๋งท
- Origin : ์์ฒญ ์ถ์ฒ
- Access-Control-Request-Method : ์ค์ ์์ฒญ์ ๋ฉ์๋
- Access-Control-Request-Headers : ์ค์ ์์ฒญ์ ์ถ๊ฐ ํค๋
Preflight Response ํฌ๋งท
- Access-Control-Allow-Origin : ์๋ฒ ์ธก ํ๊ฐ ์ถ์ฒ
- Access-Control-Allow-Methods : ์๋ฒ ์ธก ํ๊ฐ ๋ฉ์๋
- Access-Control-Allow-Headers : ์๋ฒ ์ธก ํ๊ฐ ํค๋
- **Access-Control-Max-Age **: Preflight ์๋ต ์บ์ ๊ธฐ๊ฐ
- ์ฌ์ ์์ฒญ๊ณผ ์ค์ ์์ฒญ์ ๋งค๋ฒ ๋ณด๋ด๋ฉด ํจ์จ์ ์ด์ง ์์ผ๋ ๋ธ๋ผ์ฐ์ ๋ ์ฌ์ ์์ฒญ์ ์บ์ฑํด๋
Preflight Response ํน์ง
- ์๋ต ์ฝ๋๋ 200๋์ฌ์ผ ํจ
- ์๋ต ๋ฐ๋๋ ๋น์ด์๋ ๊ฒ์ด ์ข์
์ Preflight๊ฐ ํ์ํ ๊น?
-
์ฌ์ ์์ฒญ์ด ์์ผ๋ฉด ์๋ฒ๋ ์์ฒญ์ ๋ํด ๋ชจ๋ ๋ก์ง์ ์ผ๋จ ์ํํจ
-
๊ทธ๋ฆฌ๊ณ ๋์ Origin์ ํ๋จ
-
์ผ๋จ ๋ก์ง์ด ์ํ๋ ํ CORS ์ด์๊ฐ ๋ฐ์
-
์ฌ์ ์์ฒญ์ด ์์ผ๋ฉด ์์ฒญ์ ์ํํ๊ธฐ ์ Origin์ ํ๋จ
-
๋๋ฌธ์ ์๋ฒ๋ ์์ ํ ์ ์ง์ผ์ง
์ธ์ฆ์ ๋ณด ํฌํจ ์์ฒญ (Credentialed Request)
- ์ธ์ฆ ๊ด๋ จ ํค๋๋ฅผ ํฌํจํ ๋ ์ฌ์ฉํ๋ ์์ฒญ
- ํด๋ผ์ด์ธํธ ์ธก
credentials : include
- ์๋ฒ ์ธก
Access-Control-Allow-Credentials : true
- ๋์ ์ด๋ฌ๋ฉด ์๋์ ๊ฐ์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์ด์ผ ํจ
์กฐ๊ฑด
Access-Control-Allow-Origin
์๋*
๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๋ช ์์ ์ธ URL์ด์ด์ผํจ- ์๋ต ํค๋์๋ ๋ฐ๋์
Access-Control-Allow-Credentials: true
๊ฐ ์กด์ฌํด์ผํจ
๐จ Access to fetch at โhttps://localhost:8080โ from origin โhttp://localhost:8000โ has been blocked by CORS policy: The value of the โAccess-Control-Allow-Originโ header in the response must not be the wildcard โ*โ when the requestโs credentials mode is โincludeโ.
CORS ํด๊ฒฐํ๊ธฐ!
ํ๋ก ํธ ํ๋ก์ ์๋ฒ ์ค์ (๊ฐ๋ฐ ํ๊ฒฝ)
- ๋ธ๋ผ์ฐ์ ์
์ฅ์์๋ origin๊ณผ target์ด ๊ฐ๊ธฐ ๋๋ฌธ์
same origin
์ถ๊ฐ
์คํ๋ง ๋ถํธ ์ด์ฉ
@CrossOrigin ์ด๋ ธํ ์ด์ ์ฌ์ฉ
์ฐธ๊ณ
- Origin์ ์ค์ ์ํด์ฃผ๋ฉด Default ๊ฐ์ผ๋ก ๋ชจ๋ Origin์ ํ์ฉํจ
- ๋๋ฌธ์ ์ค์ ํด์ฃผ๋ ๊ฒ์ด ์ข์