๐ SOP์ CORS์ ๋ํด์ ์ค๋ช ํด์ฃผ์ธ์
์นํ์ด์ง๋ฅผ ๋ง๋ค๋ค๋ณด๋ฉด ๋ค๋ฅธ ํ์ด์ง์ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์ฌ ๋ CORS ์๋ฌ
๋ผ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๋ ๋ธ๋ผ์ฐ์ ์ SOP์ ์ํด์ ๋ฐ์ํ๋ ํ์์ด๋ค.
๋์ผ ์ถ์ฒ ์ ์ฑ (SOP: Same-origin policy) ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ๋ค์ ์คํฌ๋ฆฝํธ ๋ด์์ ์ด๊ธฐํ๋๋ cross-origin HTTP ์์ฒญ์ ์ ํํ๋ค.
๋ค๋ฅธ ์ถ์ฒ์์ ๊ฐ์ ธ์จ ๋ฆฌ์์ค(๋ฌธ์, ์คํฌ๋ฆฝํธ ๋ฑ)์ ์ํธ์์ฉํ๋ ๊ฒ์ ์ ํํ์ฌ ์ ์ฌ์ ์ ์ฑ ๋ฌธ์๋ฅผ ๊ฒฉ๋ฆฌํ๋ค.
โ ๏ธ SOP๋ฅผ ์๋ฐํ๋์ง๋ ์๋ฒ๊ฐ ์๋ ๋ธ๋ผ์ฐ์ ์์ ํ์ธํ๋ค.
๋์ผ ์ถ์ฒ๋ ๋ URL์ ํ๋กํ ์ฝ, ํฌํธ(๋ช ์ํ ๊ฒฝ์ฐ), ํธ์คํธ๊ฐ ๋ชจ๋ ๊ฐ์ ์ถ์ฒ์ด๋ค.
์๋ฅผ ๋ค์ด http://store.company.com/dir/page.html
์ ๋์ผ ์ถ์ ์ธ ๊ฒ์ ์๋์ ๊ฐ๋ค.
URL | ๋์ผ ์ถ์ฒ | ์ด์ |
---|---|---|
http://store.company.com/dir2/other.html | โ | |
http://store.company.com/dir/inner/another.html | โ | |
https://store.company.com/secure.html | โ | ํ๋กํ ์ฝ(https )์ด ๋ค๋ฆ |
http://store.company.com:81/dir/etc.html | โ | ํฌํธ(:81 )๊ฐ ๋ค๋ฆ |
http://news.company.com/dir/other.html | โ | ํธ์คํธ(news )๊ฐ ๋ค๋ฆ |
์๋์ ๊ฐ์ ๊ต์ฐจ ์ฝ์ ์ ๊ฒฝ์ฐ SOP์ ์๊ด์์ด ํ์ฉ๋๋ค.
<link>
ํ๊ทธ๋ก ๋ค๋ฅธ ๋๋ฉ์ธ์ CSS๋ฅผ ๊ฐ์ ธ์ค๊ธฐ<script>
ํ๊ทธ๋ก ๋ค๋ฅธ ๋๋ฉ์ธ์ JavaScript ๊ฐ์ ธ์ค๊ธฐ<img>
, <video>
, <audio>
, <embed>
, <object>
<iframe>
์ผ๋ก ์ฝ์
๋๋ ๋ชจ๋ ๊ฒ<iframe>
์ Clickjacking ๊ณต๊ฒฉ์ ๋นํ ์ ์๋ค.@font-face
(์ผ๋ถ ๋ธ๋ฌ์ฐ์ ๋ง๋ค ๋ค๋ฅผ ์ ์์)@font-face
: ์น ๋ธ๋ผ์ฐ์ ์๊ฒ ํด๋น ์์ฒด๋ฅผ ๋ค์ด๋ก๋ํจโ ๏ธ ๊ต์ฐจ ์ฝ๊ธฐ(JS๋ก ์ ๊ทผํ ๊ฒฝ์ฐ)๋ ํ์ฉ๋์ง ์๋๋ค.
โ ๏ธ IE ์ ๊ฒฝ์ฐ SOP์ ๋๊ฐ์ง ์ค์ ์์ธ์ฌํญ์ด ์๋ค.
- ์ ๋ขฐ๊ฐ๋ฅํ ์ฌ์ดํธ: ์์ชฝ ๋๋ฉ์ธ ๋ชจ๋๊ฐ ๋์ ๋จ๊ณ์ ๋ณด์ ์์ค์ ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ ๋์ผ ์ถ์ฒ ์ ์ฝ์ ์ ์ฉํ์ง ์๋๋ค.
- ํฌํธ ๋ฌด์ : ํฌํธ๊ฐ ๋ค๋ฅด๋๋ผ๋ ๋์ผ ์ถ์ฒ๋ก ์ฌ๊น
SOP(Same Origin Policy) ๋๋ฌธ์ ๋ค๋ฅธ ์ถ์ฒ์ ์์์ ์ธ ์ ์๋ค.
๊ทธ๋ฌ๋ CORS๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ ์ ์๋ค.
CORS(Cross-Origin Resource Sharing)๋ ๋๋ฉ์ธ ๋๋ ํฌํธ๊ฐ ๋ค๋ฅธ ์๋ฒ์ ์์์ ์์ฒญํ๋ ๋งค์ปค๋์ฆ์ ๋งํ๋ค.
์ฆ, ๋ค๋ฅธ ์ถ์ ์ ์ํํ ์์์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋ค.
์ด๋ ์์ฒญ์ cross-origin HTTP ์ ์ํด ์์ฒญ๋๋ค.
๐ก ์ถ์ฒ๋ฅผ ๋น๊ตํ๋ ๋ก์ง์ ์๋ฒ๊ฐ ์๋ ๋ธ๋ผ์ฐ์ ์ ๊ตฌํ๋์ด ์๋ค.
๋ฐ๋ผ์, SOP๋ฅผ ์๋ฐํ๋ ๋ฆฌ์์ค ์์ฒญ์ ํด๋ ์๋ฒ์์๋ ์ ์ ์๋ต์ ํ ๋ก๊ทธ๋ก ๋จ์ ์ ์๋ค.
๐ก SOP ๋ฅผ ์๋ฐํ๋ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ๋ ์์ฒญ์ ํค๋์
Origin
,referer
๋ฅผ ์ถ๊ฐํ๋ค.
Origin
: ์์ฒญ์ด ์์๋ ์๋ฒ๋ฅผ ๋ํ๋ด๋ urlreferer
: ํ์ฌ ์์ฒญ๋ ํ์ด์ง์ ๋งํฌ ์ด์ ์ ์น ํ์ด์ง ์ฃผ์
๋ค์๊ณผ ๊ฐ์ ์์ฒญ์ CORS๊ฐ ์ฌ์ฉ๋๋ค.
@font-face
(์ผ๋ถ ๋ธ๋ฌ์ฐ์ ๋ง๋ค ๋ค๋ฅผ ์ ์์)drawImage()
๋ฅผ ์ฌ์ฉํดย ์บ๋ฒ์ค์ ๊ทธ๋ฆฐ ์ด๋ฏธ์ง/๋น๋์ค ํ๋ ์img {
float: left;
/* ์ฌ๋ฐฑ์ ํด๋น ๋ชจ์์ผ๋ก ๋๋ฌ์ธ๊ฒ ํจ */
shape-outside: url(../images/star-shape1.png);
}
JavaScript, CSS ๊ฐ์ ๋ฆฌ์์ค๋ค์ Cross-Origin ์ ์ฑ ์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์ ์ธ๋ถ ์์ฒญ์ด ๊ฐ๋ฅํ๋ค.(์์ ๋์ผ ์ถ์ฒ ํ์ฉ ์ฐธ์กฐ)
Origin
ํ๋์ ์์ฒญ์ ๋ณด๋ด๋ ์ถ์ฒ ๋ฅผ ํจ๊ป ๋ด์์ ๋ณด๋Accewss-Control-Allow-Origin
์ ๋ฆฌ์์ค ์ถ์ฒ๋ฅผ ์ฃผ๊ณ ํด๋ผ์ด์ธํธ์ ์๋ตํ๋ค.Origin
๊ณผ Access-Control-Allow-Origin
์ ๋น๊ตํ์ฌ SOP๋ฅผ ์๋ฐํ๋์ง ํ์ธํ๋ค.์ด๋ฌํ ๋์์ ์๋์ 3๊ฐ์ง ์๋๋ฆฌ์ค์ ์ํด ๋ค์ ๋ฌ๋ผ์ง๋ค.
๋ธ๋ผ์ฐ์ ๊ฐ ์๋น์์ฒญ๊ณผ ๋ณธ ์์ฒญ์ผ๋ก ๋๋์ด ์๋ฒ๋ก ์ ์กํ๊ฒ ๋๋๋ฐ, ์ด ์๋น์์ฒญ์ Preflight ๋ผ๊ณ ํ๋ค.
OPTIONS
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ Preflight Request์ ๋ณด๋ธ๋ค.OPTIONS
๋ฉ์๋๋ ๋ชฉํ ๋ฆฌ์์ค์์ ํต์ ์ต์
์ ์ค๋ช
ํ๊ธฐ ์ํด ์ฌ์ฉ๋จ๐ก Preflight Request๋ก ์๋์ ์ ๋ณด๋ฅผ ๋ฃ์ด ์๋ฒ์๊ฒ ๋ณด๋ธ๋ค.
Access-Control-Request-Method
: ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉํ ๋ฉ์๋Access-Control-Request-Headers
: ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ผ HTTP headers
๋ช ํํ ๋ช ์นญ์ ์์ง๋ง Prefilght Request๋ฅผ ๋ณด๋ด์ง ์๊ณ ์๋ฒ์๊ฒ ์์ฒญ์ ํ๋ ๊ฒ์ ๋จ์ ์์ฒญ(Simple Request)์ด๋ผ๊ณ ํ๋ค.
Access-Control-Allow-Origin
๊ณผ ๊ฐ์ ๊ฐ์ ์ฃผ์ด ๋ธ๋ผ์ฐ์ ๊ฐ SOP ์๋ฐ ์ฌ๋ถ๋ฅผ ํ๋จํ๊ฒ ํจAccess-Control-Allow-Origin: * | <origin> | null
Access-Control-Allow-Origin: <origin>
์ธ ๊ฒฝ์ฐ Vary
์์ฑ๋ ๊ฐ์ด ์ ๊ณตํด์ผํ๋ค. (MDN ์ฐธ๊ณ )๐
Vary
ํค๋ ์์ฑ์ ์๋ต ์๊ฐ์ ์ค์ด๊ธฐ ์ํด ์บ์ ์๋ต์ ์ ๊ณตํ ์ง ๋๋ ์๋ณธ ์๋ฒ์ ์๋ก์ด ์๋ต์ ์์ฒญํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐ ํ์ํ ๊ฐ์ด๋ค.
โ ๏ธ Simple Request๋ฅผ ํ๊ธฐ ์ํด ์๋์ ์กฐ๊ฑด์ ์ ๋ถ ๋ง์กฑํด์ผํ๋ค.
GET
,HEAD
,POST
๋ฉ์๋ ์ค ํ๋๋ฅผ ์ฌ์ฉAccept
,Accept-Language
,Content-Language
,Content-Type
,DPR
,Downlink
,Save-Data
,Viewport-Width
,Width
๋ฅผ ์ ์ธํ ํค๋๋ฅผ ์ฌ์ฉํ๋ฉด ์๋๋ค.Content-Type
์ฌ์ฉ์application/x-www-from-urlencoded
,multipart/form-data
,text/plain
๋ง์ด ํ์ฉ
Credentialed Request(์ธ์ฆ๋ ์์ฒญ)์ ๋ณด์์ ๊ฐํํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ผ๋ฐ์ ์ผ๋ก XMLHttpRequest
, fetch
๋ ๋ณ๋ ์ต์
์์ด ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค ์ ๋ณด, ์ธ์ฆ๊ณผ ๊ด๋ จ๋ ํค๋๋ฅผ ์์ฒญ์ ๋ฃ์ง ์๋๋ค.
์ธ์ฆ ๊ด๋ จ ์ ๋ณด๋ฅผ ๋ณด๋ด๋ ๊ฒฝ์ฐ JS๊ฐ ์ฌ์ฉ์๋ฅผ ๋์ ํด ๋ฏผ๊ฐํ ์ ๋ณด์ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์์ฒญ ํค๋์ credentials
์ต์
์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ธ์ฆ ๊ด๋ จ๋ ํค๋๋ฅผ ๋ฃ์ ์ ์์ผ๋ฉฐ 3๊ฐ์ง ๊ฐ์ ์ฌ์ฉํ ์ ์๋ค.
same-origin
: ๊ธฐ๋ณธ๊ฐ์ด๋ฉฐ, ๊ฐ์ ์ถ์ฒ ๊ฐ ์์ฒญ์๋ง ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด๊ฒ ํจinclude
: ๋ชจ๋ ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์omit
: ๋ชจ๋ ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ง ์์์์ฒญ์ ์ธ์ฆ ์ ๋ณด๊ฐ ๋ด๊ธด ์ํ ์์ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ SOP ์๋ฐ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๋ ๊ท์น์ ๋ค์ ๋๊ฐ์ง๋ฅผ ์ถ๊ฐํ๋ค.
Access-Control-Allow-Origin
์๋*
๋ฅผ ์ฌ์ฉํ ์ ์์- ์๋ต ํค๋์๋ ๋ฐ๋์
Allow-Control-Allow-Credentials: true
๊ฐ ์กด์ฌํด์ผํจ
origin
์ด๋ referer
๋ฅผ ํ์ธํด์ ์ถ๊ฐ์ ์ธ ์ฒ๋ฆฌ๋ฅผ ํ ์๋ ์๋ค. (CORS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋ด๋ถ์ ์ผ๋ก ์ด๋ฅผ ํ์ธํ๋ค.)origin
ํค๋์ referer
ํค๋๋ฅผ ์๋์ผ๋ก ๋ถํ์ค๋ค.