CORS.md
๐กCORS & SOP
origin, CORS, SOP์ CORS ์๋๋ฆฌ์ค, ๊ทธ๋ฆฌ๊ณ Proxy์ ๋ํด ๊ฐ๋จํ ์์๋ด ๋๋ค.
Origin์ด๋?
์ถ์ฒ origin
- ์น ํ์ด์ง ๋๋ ์์์ ์ก์ธ์คํ๋ ํน์
ํ๋กํ ์ฝ
,ํธ์คํธ
,ํฌํธ
์ ์กฐํฉ
ํ์ธํ๋ ๊ณณ
- window location๊ฐ์ฒด์ origin
- ๋ธ๋ผ์ฐ์ ์ ๊ด๋ฆฌ์ ๋๊ตฌ์ ๋คํธ์ํฌ ์์ฒญ
- Request์ origin ํค๋
- Response์ Access-Control-Allow-Originํค๋
- Request์ origin ํค๋
CORS์ SOP๊ฐ ์ ํ์ํ๋์?
-
์น ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ณด์์ ์ํ ๊ฐ๋ ์ ๋๋ค.
-
CORS๋ cross-site ๊ณต๊ฒฉ์ ๋ง๊ธฐ ์ํ ๋ณด์ ๋งค์ปค๋์ฆ์ ๋๋ค. ex) CSRF, XSS
๐ค CSRF (Cross-Site Request Forgery) : ์ด๋ฏธ ์ธ์ฆ๋ ์ฌ์ฉ์๊ฐ ์น ์ฌ์ดํธ์์ ์์ ์ ์ํํ๋๋ก ์์ด๋ ๊ณต๊ฒฉ์ ๋๋ค. ์ด๋ ์ฌ์ฉ์๊ฐ ๋ฐฉ๋ฌธํ๋ ์น ์ฌ์ดํธ์ ์ ์ฑ ๋งํฌ ๋๋ ์์์ ์ฝ์ ํ์ฌ ์ํ๋ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ํด๋ฆญํ๋ฉด, ๋์ ์น ์ฌ์ดํธ์์ ์์ ์ด ์ํ๋๋ฉฐ ์ฌ์ฉ์๋ ์ด๋ฅผ ์์ง ๋ชปํฉ๋๋ค. CORS๋ ์ธ์ฆ๋ ๋๋ฉ์ธ์ผ๋ก๋ถํฐ์ ์์ฒญ๋ง ํ์ฉํ๊ณ ์ธ์ฆ๋์ง ์์ ๋๋ฉ์ธ์ผ๋ก๋ถํฐ์ ์์ฒญ์ ๊ฑฐ๋ถํ๋ ๊ฒ์ผ๋ก CSRF๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
XSS(Cross-Site Scripting) : ๊ณต๊ฒฉ์๊ฐ ์น ์ฌ์ดํธ์ ์ ์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์ ํ๋ ๊ณต๊ฒฉ์ ๋๋ค. ์ด๋ ์น ์ฌ์ดํธ๊ฐ ์ฌ์ฉ์ ์ ๋ ฅ์ ์ ์ ํ๊ฒ ๊ฒ์ฆํ์ง ์๊ณ ์ ์ฑ ์ฝ๋๋ฅผ ์คํํ ์ ์๋ ๊ฒฝ์ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. CORS๋ ์ธ์ฆ๋ ๋๋ฉ์ธ์์๋ง ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋๋ก ํ์ฌ XSS ๊ณต๊ฒฉ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. (+XSS filter, whitelist lib)
| ๊ฐ๋ | ์์ด | ์ฐ์ | ์์ฝ | | --- | --- | --- | --- | | CORS | Cross-Origin Resource Sharing | ๋ณด์ ๋งค์ปค๋์ฆ | ์๋ฒ๊ฐ ๋ค๋ฅธ ๋๋ฉ์ธ์ ์์์ ์ก์ธ์ค ํ๋๋ก ํ์ฉ | | CSRF | Cross-Site Request Forgery | ๋ณด์ ๊ณต๊ฒฉ | ์ธ์ฆ๋ ์ฌ์ฉ์๊ฐ ์ ์ฑ ๋งํฌ์์ ์์ ์ ์ํํ๋๋ก ํจ | | XSS | Cross-Site Scripting | ๋ณด์ ๊ณต๊ฒฉ | ์น ์ฌ์ดํธ์ ์ ์ฑ ์ฝ๋๋ฅผ ์ฝ์ ํ์ฌ ์คํํ๊ฒ ํจ |
-
Cross-Origin Resource Sharing
๐ CORS๋ "Cross-Origin Resource Sharing", ๊ต์ฐจ ์ถ์ฒ ์์ ๊ณต์ ์ ์ฝ์์ ๋๋ค.
ํ๋์ ๋๋ฉ์ธ์์ ์์ฑ๋ ์น ํ์ด์ง๊ฐ ๋ค๋ฅธ ๋๋ฉ์ธ์ ์์์ ์ก์ธ์คํ ์ ์๋๋ก ํ์ฉํ๋ ์ ์ฑ ์ ๋๋ค. ์น ๋ธ๋ผ์ฐ์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค๋ฅธ ๋๋ฉ์ธ์ผ๋ก์ ์์ฒญ์ ํ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ CORS๊ฐ ํ์ํฉ๋๋ค.
์ฆ, CORS๋ ์๋ฒ๊ฐ ๋ค๋ฅธ ๋๋ฉ์ธ์ ์น ํ์ด์ง์์ ์์์ ์ก์ธ์ค ํ ์ ์๋๋ก ํ์ฉํ๊ฒ๊ธ ํฉ๋๋ค.
SOP Same-Origin Policy
๐ SOP๋ "Same-Origin Policy" ๋์ผ ์ถ์ฒ ์ ์ฑ ์ ์ฝ์์ ๋๋ค.
ํ๋์ origin์์ ์์ฑ๋ ์น ํ์ด์ง๊ฐ ๋ค๋ฅธ origin์ ์น ํ์ด์ง ๋๋ ์์๊ณผ ์ํธ ์์ฉํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๊ฒ์ ๋๋ค.
(์์ ์์: ์คํฌ๋ฆฝํธ, ์ด๋ฏธ์ง, ์คํ์ผ์ํธ ๋ฑ)
๊ฐ์ ์ถ์ฒ ์์
- https://google.co.kr์ ๊ฐ์ origin์ธ์ง ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
| url | Same Origin | ์ค๋ช | | --- | --- | --- | | https://google.co.kr/maps | O | ํธ์คํธ๊ฐ ๊ฐ์ | | http://google.co.kr | X | ํฌํธ๊ฐ ๋ค๋ฅด๋ฏ๋ก ๋ค๋ฅธ origin์ ๋๋ค. | | https://google.co.kr:443/maps?hl=en&authuser=0 | O | ํฌํธ๋ฒํธ๊ฐ ์๋์ ์ผ๋ก ๋ช ์๋์ด ์์ต๋๋ค.(https) | | https://api.google.co.kr | X | ํธ์คํธ๊ฐ ๋ค๋ฆ | | https://google.co.kr:8080 | ฮ | ๋๋ถ๋ถ์ ๋ธ๋ผ์ฐ์ : ๊ฐ์ ์ถ์ฒ / IE: ๋ค๋ฅธ ์ถ์ฒ |
๐ค port์ ๋ํ CORS ์ ์ฑ ์ด ๋ช ํํ์ง ์์๊ธฐ ๋๋ฌธ์, ๊ฐ์ ํธ์คํธ์ ๋ค๋ฅธ ํ๋กํ ์ฝ์ด ๋์ผ ์ถ์ฒ์ด๋์ ๋ํด์ ๋ธ๋ผ์ฐ์ ์ ์ฐจ์ด๊ฐ ์์์ต๋๋ค.
(IE : ํฌํธ๊ฐ ๋ค๋ฅด๋ฉด ๊ฐ์ ์ถ์ฒ๋ก ์ธ์ ํ์ง ์์ต๋๋ค. ์๋ IE!)
CORS ์๋๋ฆฌ์ค
๐ request์ response์ ํค๋๋ฅผ ๋น๊ตํ์ฌ ๊ฐ์ ์ถ์ฒ๋ฅผ ํ์ธํฉ๋๋ค.
- Request์ origin ํค๋
- Response์ Access-Control-Allow-Originํค๋
1. ์ฌ์ ์์ฒญ Preflight Request
| ๊ตฌ๋ถ | ์กฐ๊ฑด | ๋น๊ณ | | --- | --- | --- | | Method | OPTIONS | ์ถ์ฒ | | Prefilight Request | Origin, Access-Control-Request-Header, Access-Control-Request-Method | ์ค์ ์์ฒญ์ ๋ฉ์๋ & ํค๋ | | Prefilight Response | Access-Control-Allow-Origin, Access-Control-Allow-Methods, Access-Control-Allow-Headers, Access-Control-Max-Age | ํ๊ฐํ ์ถ์ฒ & ๋ฉ์๋ & ํค๋ ๊ทธ๋ฆฌ๊ณ ์๋ต ์บ์ ์๊ฐ |
์ฌ์ ์์ฒญ Preflight์ด๋?
- ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์ ์ ์ํ๋ฉด, OPTIONS ๋ฉ์๋๋ก ์๋น์์ฒญ(์ฌ์ ์์ฒญ)์ ๋ณด๋
๋๋ค.
- Origin๊ณผ Acess-control-allow-origin์ด ๊ฐ์ผ๋ฉด
200 OK
: ๋ณธ ์์ฒญ(์ค์ ์์ฒญ)์ ๋ณด๋ ๋๋ค.
- Origin๊ณผ Acess-control-allow-origin์ด ๊ฐ์ผ๋ฉด
๐ ๋ด์ฉ
- prefilight request
- Origin ๋ฟ๋ง ์๋๋ผ, ์๋น์์ฒญ ์ดํ ๋ณด๋ผ ๋ณธ ์์ฒญ์ ๋ํ ์ ๋ณด๋ค ํฌํจ
- Access-Control-Request-Header : ์ค์ ์์ฒญ์ ์ถ๊ฐ ํค๋
- Access-Control-Request-Method : ์ค์ ์์ฒญ์ ๋ฉ์๋
- Prefilight Response
- Access-Control-Allow-Origin : ํ๊ฐ ์ถ์ฒ
- Access-Control-Allow-Methods : ํ๊ฐ ๋ฉ์๋
- Access-Control-Allow-Headers : ํ๊ฐ ํค๋
- Access-Control-Max-Age: Prefilight ์๋ต ์บ์ ์๊ฐ
์๋ต ์
- Prefilight Response์ ์๋ต ์ฝ๋๋ 200์ด์ด์ผ ํ๋ค.
- origin๊ณผ acess-control-allow-origin์ด ๋ค๋ฅด๋ค๋ฉด, ๋ณธ ์์ฒญ(์ค์ ์์ฒญ)์ ๋ณด๋ด์ง ์์
2. ๋จ์ ์์ฒญ Simple Request
๋จ์ ์์ฒญ Simple Request๋?
- ์ฌ์ ์์ฒญ ์์ด, ๋ฐ๋ก ๋ณธ ์์ฒญ์ ๋ณด๋ ๋๋ค.
- ๋จ, ์ ์ฝ์กฐ๊ฑด ๋๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ณ๋ก ์์ต๋๋ค.
๐ ์กฐ๊ฑด
- ๋ฉ์๋ : GET, POST, HEAD
- content-type
- application/x-www-form-urlencoded
- multipart/form-data
- text
- ํค๋
- Accept, Accept-Language, Content-Language, Content-Type
3. ์ธ์ฆ(๋ณด์) ์์ฒญ Credentialed Request
- ์ต์ ๊ฐ์ ํตํด ์ธ์ฆ๋ ์ฌ์ฉ์์ธ์ง ํ์ธํ๋ ์ ์ฐจ๋ฅผ ๊ฑฐ์นจ
| ์ต์ ๊ฐ | ์ค๋ช | | --- | --- | | Same-Origin | ๊ธฐ๋ณธ๊ฐ, ๊ฐ์ ์ถ์ฒ ๊ฐ ์์ฒญ์๋ง ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ | | Include | ๋ชจ๋ ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ | | Omit | ๋ชจ๋ ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ง ์์ |
Credentialed Request๋?
- ์ธ์ฆ ๊ด๋ จ ํค๋๋ฅผ ํฌํจํ ๋ ์ฌ์ฉ
๐ ๋ด์ฉ
- credentials: include
- ์ฟ ํค ๋๋ JWT ํ ํฐ์ ๋ด์์ ์๋ฒ์ ๋ณด๋ผ ๋ ์ฌ์ฉํ๋ค.
์ ์ฝ์ฌํญ
- Access-Control-Allow-Origin์๋ *์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๋ช ์์ ์ธ URL์ด์ด์ผ ํ๋ค.
- ์๋ต ํค๋์๋ Access-control-allow-credentials: true๊ฐ ์กด์ฌํด์ผ ํ๋ค.
CORS ํด๊ฒฐ ๋ฐฉ๋ฒ: Cross-Origin Resource Sharing
Cross-Origin Resource Sharing, ๊ต์ฐจ ์ถ์ฒ ์์ ๊ณต์
๋ชจ๋ ์ถ์ฒ์ ์์์ ๋ฐ์ ๊ฒฝ์ฐ ๋ณด์ ์์ ์ํ์ด ์์ผ๋ฏ๋ก, ํน์ ์ถ์ฒ์์๋ง ์์๋ง ๊ณต์ ๋ฐ๋ ๊ฒ์ ๋งํฉ๋๋ค.
- Webpack Dev Server ๋ฆฌ๋ฒ์ค ํ๋ก์ฑ (์ฐํ)
- ํ๋ก ํธ ์๋ฒ์์ ๋ฐฑ์๋ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ผ ๋, url์ ๋ณ๊ฒฝํ๋ค.
- ๋ก์ปฌ ํ๊ฒฝ์์๋ง ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ ๋๋ค.
- ์๋ต ํค๋ ์ค์
- ํ๋ก ํธ์ ์๋ต์ ๋ด๋ ค์ค ๋, ์ฌ๋ฐ๋ฅธ Access-Control-Allow-Origin์ ์ธํ ํด์ผ ํ๋ค.
- ์ง์ ํค๋์ ์ค์ ์ ์ถ๊ฐํ๋ค.
- ์คํ๋ง๋ถํธ(์๋ฐ) ์ค์
- ์ค์ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ย
WebMvcConfigurer
์ ๊ตฌํํ๋ฉดยaddCorsMappings
๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ CORS์ ์ถ์ฒ ๋ฐ ์ค์ ๊ด๋ฆฌ๋ฅผ ํ ์ ์๋ค.
- ์ค์ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ย
๋ ํผ๋ฐ์ค :
- https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
- https://velog.io/@frankle97/CORS๋
- https://medium.com/@dtkatz/3-ways-to-fix-the-cors-error-and-how-access-control-allow-origin-works-d97d55946d9
- https://chat.openai.com/chat
- https://www.youtube.com/watch?v=dHcjwTvrxTk
- https://www.youtube.com/watch?v=7iGIfcEsc2g