๋์ผ ์ถ์ฒ ์ ์ฑ (Same-origin Policy)
์ ์ด๋ค์ถ์ฒ
์์ ๋ถ๋ฌ์จ ๋ฌธ์๋ ์คํฌ๋ฆฝํธ๊ฐ ๋ค๋ฅธ ์ถ์ฒ์์ ๊ฐ์ ธ์จ ๋ฆฌ์์ค์ ์ํธ์์ฉํ๋ ๊ฒ์ ์ ํํ๋ ์ค์ํ๋ณด์ ๋ฐฉ์
์ด๋ค.
์ธํฐ๋ท์์ ์ ์์ ์ธ ์ฌ์ดํธ๋ค์ ๊ณต๊ฒฉ๋ค๊ณผ ์ ์ฌ์ ์ผ๋ก ํด๋ก์ธ ์ ์๋ ๋ฌธ์๋ฅผ ๊ฒฉ๋ฆฌํด ๋ณด์ ์ํ์ผ๋ก๋ถํฐ
๋ณดํธ
ํ ์ ์๋ค.
์๋ฅผ ๋ค์ด, ํน์ ์ฌ์ดํธ์ ๋ก๊ทธ์ธ์ ํ๋ฉด ๋ค์ ๋ก๊ทธ์ธํ ํ์๊ฐ ์๋๋ก ๋ก๊ทธ์ธ์ด ์ ์ง๋๋ ๊ฒ์ ๋ณธ์ ์ด ์์ ๊ฒ์ด๋ค. ๋ก๊ทธ์ธ ์ ์ง๋ฅผ ์ํด ์ฌ์ฉํ๋ ๊ฒ์ด ์ฟ ํค์ธ๋ฐ, ์ฌ๊ธฐ์ ๋ก๊ทธ์ธ ์ ๋ณด๊ฐ ์ ์ฅ๋์ด ์์ด ์ฌ์ดํธ์ ์ ์ํ ๋๋ง๋ค ๋ก๊ทธ์ธ์ด ์ ์ง๋ ์ ์๋๋ก ํด์ค๋ค. ๋ง์ฝ ํด์ปค๊ฐ ํดํน์ ์ํด ๋ง๋ ์ฌ์ดํธ์ ์ฌ์ฉ์๊ฐ ์ ์ํ๋ฉด ์ฌ์ฉ์ ์ปดํจํฐ์ ๋ฑ๋ก๋์ด ์๋ ์ฟ ํค๊ฐ ํด๋น ์ฌ์ดํธ์ ํ๋ฌ๋ค์ด๊ฐ๊ฒ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด์ปค๋ค์ด ์ฟ ํค๋ฅผ ์ด์ฉํด ์ฌ์ฉ์ ๊ฐ์ธ์ ๋ณด๋ฅผ ๋นผ๋ด์ฌ ์ ์๋ ์น๋ช ์ ์ธ ๋ณด์ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ์ ์๋ ๊ฒ์ด๋ค.
๋๋ฌธ์ SOP
์ ๋๋ถ์ด CORS
๋ ์
์์ ์ธ ๊ณต๊ฒฉ์ ๋ง๋ ๋ณด์ ๋ฉ์ปค๋์ฆ์ ๋ฐ๋์ ํ์ํ ์กด์ฌ๋ค์ด๋ค.
SOP์์ ์ด์ผ๊ธฐํ๋ ์ถ์ฒ
๊ฐ ๋ฌด์์ธ์ง ๋จผ์ ์ดํด๋ณด๊ธฐ ์ ์ URL ๊ตฌ์กฐ
๋ฅผ ์๊ณ ๋์ด๊ฐ๋ ๊ฒ์ด ์ข๋ค. URL ๊ตฌ์กฐ๋ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ๋ค.
ํ๋กํ ์ฝ์ HTTP
๋ 80๋ฒ
, HTTPS
๋ 443๋ฒ
ํฌํธ๋ฅผ ์ฌ์ฉํ๋๋ฐ, 80๋ฒ๊ณผ 443๋ฒ ํฌํธ๋ ์๋ต์ด ๊ฐ๋ฅํ๋ค.
์ถ์ฒ
๋, ์ URL ๊ตฌ์กฐ์์ ์ดํด๋ณธ Protocol, Host, Port๋ฅผ ํฉ์น ๊ฒ์ ๋งํ๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ์ ์ฝ์ ์ฐฝ์ location.origin
๋ฅผ ์คํํ๋ฉด ์ถ์ฒ๋ฅผ ํ์ธํ ์ ์๋ค.
์์ฒญํ ์ถ์ฒ
์์๋ตํ ์ถ์ฒ
๋ฅผ ๋น๊ตํด์Protocal
,host
,port
๊ฐ ๊ฐ๋ค๋ฉด๋์ผ์ถ์ฒ(Same-origin)
์ด๋ผ๊ณ ํ๋ค.
์๋ ํ๋ https://news.google.com์ ๋์ผ ์ถ์ฒ(Same Origin)
์ธ๊ฐ๋ฅผ ๋น๊ตํ ๊ฒ์ด๋ค.
URL | ๊ฒฐ๊ณผ | ์ด์ |
---|---|---|
https://news.google.com/other.html | ์ฑ๊ณต | ๊ฒฝ๋ก๋ง ๋ค๋ฅธ๊ฑด ๊ด์ฐฎ์ |
https://news.google.com:8080 | ์คํจ | ํฌํธ๊ฐ ๋ค๋ฆ |
http://news.google.com | ์คํจ | ํ๋กํ ์ฝ์ด ๋ค๋ฆ |
https://coin.google.com | ์คํจ | ํธ์คํธ๊ฐ ๋ค๋ฆ |
about:blank
์javascript:
URL์ ์ถ์ฒ ์๋ฒ์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๋ค. ๋ฐ๋ผ์ ์ด๋ฐ URL์์ ์คํํ๋ ์คํฌ๋ฆฝํธ๋ ํด๋น URL์ ๊ฐ์ง๊ณ ์๋ ๋ฌธ์์ ์ถ์ฒ๋ฅผ ์์ํ๋ค.
๐ Trust Zones
: ์์ชฝ ๋๋ฉ์ธ ๋ชจ๋๊ฐ ๋์
๋จ๊ณ์ ๋ณด์ ์์ค์ ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ ๋์ผ ์ถ์ฒ ์ ์ฝ์ ์ ์ฉํ์ง ์๋๋ค.
๐ Port
: ํฌํธ๋ฒํธ๋ Origin์ ์ฒดํฌํ ๋ ํฌํจ๋์ง ์๋๋ค. ์ฆ, ๋ค๋ฅธ ํฌํธ๋ก ์์ฒญ์ ํ ์ ์๋ค.
document.domain
์ ๊ฐ์ ํ ๋นํ๋ ๋ฐฉ์์ผ๋ก ์ฝ๊ฐ์ ์ ํ๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์์ง๋ง, ๋ณด์์ ์ธ ์ด์ ๋ก ์ฌ์ฉํ์ง ์๋๋ค.
SOP๋ ๊ต์ฐจ์ ๊ทผ(Cross-origin)์ ๋ํด 3๊ฐ์ง ์นดํ ๊ณ ๋ฆฌ๋ก ๋๋๊ณ ๊ฐ๊ฐ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ค.
์ฐ๊ธฐ
: ์ผ๋ฐ์ ์ผ๋ก ํ์ฉํ๋ค. ์ผ๋ถ HTTP์์ฒญ์ CORS์ preflight๊ฐ ํ์ํ๋ค. <a>
<form>
์ผ๋ก ๋ค๋ฅธ origin์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ ์์
์๋ฒ ๋ฉ
: ์ผ๋ฐ์ ์ผ๋ก ํ์ฉํ๋ค. <script src="..."></script>
<link rel="stylesheet" href="โฆ">
<img>
, <video>
, <audio>
, <object>
, <embed>
@font-free
<iframe>
์ฝ๊ธฐ
: ์ผ๋ฐ์ ์ผ๋ก ํ์ฉํ์ง ์๋๋ค.
๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (Cross-origin Resource Sharing)
๋HTTP ํค๋
๋ฅผ ์ฌ์ฉํ์ฌ, ํ ์ถ์ฒ์์ ์คํ ์ค์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค๋ฅธ ์ถ์ฒ์ ์ ํํ ์์์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋๋ก๋ธ๋ผ์ฐ์
์ ์๋ ค์ฃผ๋ ์ฒด์ ์ด๋ค.
CORS์ ๋์ ๋ฐฉ์์
Simple Request(๋จ์ ์์ฒญ ๋ฐฉ๋ฒ)
๊ณผPreflight Request(์๋น ์์ฒญ)
์ ๋จผ์ ๋ณด๋ด๋ ๋ฐฉ๋ฒ 2๊ฐ์ง๊ฐ ๋ํ์ ์ผ๋ก ์กด์ฌํ๋ค.
๋จ์ ์์ฒญ ๋ฐฉ๋ฒ
์ ์๋ฒ์๊ฒ ์์ฒญ์ ๋ฐ๋ก ๋ณด๋ด๋ ๋ฐฉ๋ฒ์ด๋ค.
Simple Request ๋์ ๋ฐฉ๋ฒ: ๋จ์ ์์ฒญ์ ์๋ฒ์ API๋ฅผ ์์ฒญํ๊ณ , ์๋ฒ๋ Access-control-Allow-Origin ํค๋
๋ฅผ ํฌํจํ ์๋ต์ ๋ธ๋ผ์ฐ์ ์ ๋ณด๋ธ๋ค. ๋ธ๋ผ์ฐ์ ๋ Access-Control-Allow-Origin ํค๋
๋ฅผ ํ์ธํด์ CORS ๋์์ ์ํํ ์ง ํ๋จํ๋ค.
Simple Request ์กฐ๊ฑด: ์๋ฒ๋ก ์ ๋ฌํ๋ ์์ฒญ์ด 3๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ์๋ฒ๋ก ์ ๋ฌํ๋ ์์ฒญ์ด ๋จ์ ์์ฒญ์ผ๋ก ๋์ํ๋ค.
GET
, HEAD
, POST
์ค ํ๋์ฌ์ผ ํ๋ค.Accept
, Accept-Language
, Content-Language
, Content-Type
, DPR
, Downlink
, Save-Data
, Viewport-Width
, Width
๋ฅผ ์ ์ธํ ํค๋๋ฅผ ์ฌ์ฉํ๋ฉด ์๋๋ค.Content-Type ํค๋
๋ application/x-www-form-urlencoded, multipart/form-data, text/plain ์ค ํ๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
Preflight
์์ฒญ์ ์๋ฒ์ ์๋น ์์ฒญ์ ๋ณด๋ด์ ์์ ํ์ง ํ๋จํ ํ ๋ณธ ์์ฒญ์ ๋ณด๋ด๋ ๋ฐฉ๋ฒ์ด๋ค.
Access-control-Allow-Origin ํค๋
๋ฅผ ํฌํจํ ์๋ต์ ๋ธ๋ผ์ฐ์ ์ ๋ณด๋ธ๋ค. ๋ธ๋ผ์ฐ์ ๋ ๋จ์ ์์ฒญ๊ณผ ๋์ผํ๊ฒ Access-control-Allow-Origin ํค๋
๋ฅผ ํ์ธํด์ CORS ๋์์ ์ํํ ์ง ํ๋จํ๋ค. CORS๋ ๋์ ๋ฐฉ์์ผ๋ก ๋๋์ด์ง๊ธฐ๋ ํ์ง๋ง, ์ธ์ฆ ์ ๋ณด ๋ฐ ์ฟ ํค๋ฅผ ์ ์กํ๋ ์ง์ ๋ํ ์ฌ๋ถ์ ๋ฐ๋ผ ๋๋์ด์ง๊ธฐ๋ ํ๋ค.
๐ Credential
๐ Non-credential
๋ง์ฝ, ๋ค๋ฅธ ์ฌ์ดํธ๋ก์ ์์ฒญ์ ์ฟ ํค์ ๊ฐ์ ์ธ์ฆ์ ๋ณด๋ฅผ ํฌํจ์ํค๊ณ ์ถ์ผ๋ฉด
credentials: 'include'
์ ์ต์ ์ ์ถ๊ฐํ๋ค. ์ด ์ธ์๋ ์๋์ ๊ฐ์ด ๋ค์ํ ์ต์ ์ด ์กด์ฌํ๋ค.
Same-origin
: ๊ฐ์ ์ถ์ฒ ๊ฐ ์์ฒญ์๋ง ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ ์ ์๋ค. Include
: ๋ชจ๋ ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ ์ ์๋ค.Omit
: ๋ชจ๋ ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ง ์๋๋ค. Access-Control-Allow-Origin: *
์ด๋ฉด ์๋๋ฉฐ, ๋ช
์์ ์ธ URL์ ์ค์ ํ์ฌํ ํ๋ค.Access-Control-Allow-Credentials: true
๊ฐ ์กด์ฌํด์ผํ๋ค.