๐ SOP? (Same Origin Policy)
๋์ผ ์ถ์ฒ ์ ์ฑ ์ผ๋ก, ํ๋์ Origin์์ ๋ก๋๋ ๋ฌธ์๋ ์คํฌ๋ฆฝํธ๊ฐ ๋ค๋ฅธ Origin์ ์์๊ณผ ์ํธ์์ฉํ์ง ๋ชปํ๋๋ก ์ ํํ๋ ๊ฒ.
์ฌ๊ธฐ์ ๋งํ๋ Origin์ ์๋ 3๊ฐ์ง ์์๋ฅผ ์กฐํฉํ ๊ฒ์ด๋ค.
โ URL Scheme (http, https ... etc URL SCHEME ์ข ๋ฅ ์ฐธ๊ณ )
โ Hostname [NodeName] (localhost, ๋ด ๋ธ๋ก๊ทธ ๊ธฐ์ค -> code-designer)
โ port (3000, 8080 ...)
์์ ์๋ ๋ธ๋ผ์ฐ์ ์์ ์์ฒญ์ ๋ณด๋ด๋ฉด, ์๋ฒ์์ ํด๋นํ๋ ๋ก์ง์ ์ํํ ๋ค "HTML์ ์์ฑ์์ผ ๋ฐํ"ํด์คฌ๋ค.
์ฆ, ํ๋์ ์๋ฒ(๋์ผํ Origin)์์ ๋ชจ๋ ์์ ์ด ์ํ๋์๋ค.
๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ์ ๊ต๋ฅํ ์ผ๋ ์ ์๊ณ ,
๋ง์ฝ ์ฐ๋ฆฌ ์๋ฒ์ ์ฐ๊ฒฐ๋์ด ์์ง ์์ ๊ณณ์์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ๋ณด์์ ๊ณต๊ฒฉ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์, SOP ์ ์ฑ ์ด ์ ์ง๋ ์ ์์๋ค.
๐ CORS? (Cross-Origin Resource Sharing)
๋ ๋ก ๋คํํ๋๋ ์น ํ์ด์ง๋ฅผ ๊ฐ๋นํ๊ธฐ ์ํด ๋ฑ์ฅํ ๊ฒ์ด CORS๋ค. ๋ฌผ๋ก SOP์ ๋จ์ ๋ ์ปค๋ฒํ๋ค.
๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ ์ ์ฑ ์ผ๋ก, ๋ค๋ฅธ Origin๊ณผ ์ํธ์์ฉํ ์ ์๊ฒ ์ ๊ทผ ๊ถํ์ ํ์ธํ๊ณ , ๋ถ์ฌํ๋ ๋ฐฉ์์ ๊ท์ฝ์ด๋ค.
๋ง์ด ์ข ์ด๋ ค์ด๋ฐ, ์ฝ๊ฒ ํ์ด๋ณด์๋ฉด
SOP ๋ฐฉ์์ด ์์๋ ๊ฑด ๊ฒฐ๊ตญ ๋ณด์ ๋ฌธ์ ์๋ค. ์๋ฒ์ ํต์ ํ๊ณ ์๋ ๋ธ๋ผ์ฐ์ ์ด์ธ์ ์ ๊ทผ์ ๋ง์๊ป ํ์ฉํ ์ ์์๋ค.
๊ทธ๋ฐ๋ฐ ์๋ฒ์์ "์ด๋ฐ Origin ๋ค์ ์ ๊ทผํด๋ ๊ด์ฐฎ์" ๋ผ๋ฉฐ ๋ฏฟ์๋งํ Origin๋ค์ ์ง์ ํด ์ค๋ค๋ฉด ?! ์์ ํ๊ฒ ํต์ ํ ์ ์์ง ์๋?!
์ฆ ์๋ฒ๊ฐ ํ์ฉํ ํด๋ผ์ด์ธํธ์๊ฒ๋ง ์๋ตํ ์ ์๊ฒ๋ (์์ ๋ ์ฑ๊ธฐ๊ณ ๋คํ์ฑ๋ ์ฑ๊ธฐ๊ณ ) ๋ง๋ ์ ์ฑ ์ด CORS์ธ๊ฑฐ๋ค ^____&
CORS๋ ์๋ 3๊ฐ์ง ์์ฒญ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋์ํ๋ค.
โ Simple Request ( ๋จ์ ์์ฒญ )
** ์ฌ์ค CORS๋ฅผ ์ ์ํ Fetch ๋ช ์ธ๋ 'Simple Request'๋ผ๋ ์ฉ์ด๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค.**
** Preflight Request์ ๋๋น๋๊ฒ ํํํ๊ธฐ ์ํด ์์์ ์ผ๋ก ์ฌ์ฉํ๋ค.**
โ Preflight Request ( ์ฌ์ ์์ฒญ )
โ Credentialed Request ( ์ธ์ฆ ์ ๋ณดๆ ์์ฒญ )
โพ Simple Request
Simple Request๋ฅผ ๋ณด๋ด๊ธฐ ์ํด์๋, ๋ณธ ์์ฒญ์ด ์๋ฒ๊ฐ ์ํ๋ ๋ฉ์๋์ ํค๋๋ฅผ ์ง๋๊ณ ์์ด์ผ ํ๋ค.
1. ์์ฒญ ๋ฉ์๋๊ฐ ์๋ ์ค ํ๋์ฌ์ผ ํ๋ค.
โ GET
โ POST
โ HEAD
2. ์์ฒญ ๋ฉ์๋๊ฐ POST๋ผ๋ฉด, ์์ฒญ ๋ฉ์๋์ Content-Type์ด ์๋ ์ค ํ๋์ฌ์ผ ํ๋ค.
โ application/x-www-form-urlencoded
โ multipart/form-data
โ text/plain
3. User-Agent๊ฐ ์๋์ผ๋ก ์ค์ ํ header๋
CORS-safelisted request-header๋ก ์ ์๋ ํค๋
์ธ์ ์ปค์คํ ํค๋๋ฅผ ์ฌ์ฉํ๋ฉด ์๋๋ค. ( ์๋๋ ํ์ฉ. ์ด์ธ๋ ๊ธ์ง !! )
๐ forbidden header name (์๋์ผ๋ก ์ค์ ๋ถ๊ฐ)
โ Accept-Charset
โ Accept-Encoding
โ Access-Control-Request-Headers
โ Access-Control-Request-Method
โ Connection
โ Content-Length
โ Cookie
โ Cookie2
โ Date
โ DNT
โ Expect
โ Host
โ Keep-Alive
โ Origin
โ Referer
โ TE
โ Trailer
โ Transfer-Encoding
โ Upgrade
โ Via
๐ CORS-safelisted request-header name (์๋์ผ๋ก ์ค์ ๊ฐ๋ฅ) โญโญ
โ Accept
โ Accept-Language
โ Content-Language
โ Content-Type
Simple Request ๋ก ์์ฒญ์ ๋ณด๋ด๊ธฐ๋ .. ๊ฝค ์ด๋ ต๋ค.
์ผ๋ฐ์ ์ผ๋ก HTTP API๋ Content-Type์ผ๋ก application/json ํ์ ์ ๊ฐ์ง๋๋ก ์ค๊ณํ๊ณ , (๋ณดํต JSONํ์์ผ๋ก ์ฃผ๊ณ ๋ฐ์ผ๋)
ํ ํฐ์ ์ธ์ฆํด์ผํ๋ (๋ก๊ทธ์ธ, ๋น๋ฐ๋ฒํธ ๋ฑ) ๊ฒฝ์ฐ์๋ Authorization header๋ฅผ ์ฌ์ฉํ๋ค๊ณ .. !!
์ค์ ๋ก Simple Request๋ฅผ ์ฌ์ฉํ๊ฒ๋๋ ๋น๋๊ฐ ๊ถ๊ธํ๊ธด ํ๋ค ใ ใ
Simple Request ๋ก ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ฉด,
ํด๋น Origin์ ํ์ฉ ์ฌ๋ถ ( Access-Control-Allow-Origin ) ๋ฅผ ๊ฒ์ฌํ ํ ํต๊ณผํ์ ๋
๋ธ๋ผ์ฐ์ ์ ์์ฒญ์ ๋ํ ์๋ต์ ์ ๋ฌํ๋ค.
โพ Preflight Request
Simple Request ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์๋ ๊ฒฝ์ฐ๋ Preflight Request ๋ฐฉ์์ผ๋ก ์งํ๋๋ค.
Preflight Request ๋ ์์ Simple Request์ฒ๋ผ ๋ฐ๋ก ๋ณธ ์์ฒญ์ ๋ณด๋ด์ง ์๋๋ค.
"๋ด๊ฐ ์ด๋ฐ ๋ฉ์๋, ์ด๋ฐ ํค๋๋ฅผ ๊ฐ์ง๊ณ ์๋๋ฐ ๋ํฌ ์๋ฒ์ ํต์ ํด๋ ๋๊ฒ ๋ ..?" ๋ผ๋ ์๋น ์์ฒญ์ ๋ณด๋ต๊ณ
"์ ๋๋ ์ด๋ฐ ๋ฉ์๋, ์ด๋ฐ ํค๋๋ฅผ ํ์ฉํด. ๋ ๋ค์ด์๋ ๋๊ฒ ๋ค/์ ๋๊ฒ ๋ค." ๋ฑ์ ์๋ต์ ๋ฐ๋ ํ ๋ณธ ์์ฒญ์ ๋ณด๋ธ๋ค.
๋น์ฐํ "๋ ์๋ผ" ๋ผ๋ ์๋ต์ ๋ฐ์ผ๋ฉด ๋ฐ์ดํฐ ์์ฒญ์ ๊ฑฐ๋ถ๋๋ค. ํ์ฉ๋์ ์์๋ง ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ค.
์ดํ ๋ณธ ์์ฒญ์ด ์ํ๋๋ ๊ณผ์ ์ Simple Request์ ๋์ผํ๋ค.
Simple Request์ Preflight Request์ ๊ต๋ฅ ๋ฐฉ์์ ๋ณด๋ฉด ์๊ฒ ์ง๋ง, ์๋ฒ์๊ฒ๋ ๋ฉ์๋์ ํค๋๊ฐ ์ ๋ง ์ค์ํ ๊ฒ ๊ฐ๋ค.
์ํ๋ ๋ฉ์๋์ ํค๋๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉด ํด๋น Origin์ ํ์ฉํ๋ ์ง ์ฌ๋ถ๋ง ๋ฐ์ง๊ณ ๋ฐ์ดํฐ ๋ฐํ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค.
Preflight Request๋ ๋ฉ์๋์ ํค๋๋ฅผ ๊ฒ์ฌํด์ ํ์ฉ๋์ง ์์ผ๋ฉด ์๋ต์ ๊ฑฐ๋ถํ๋ ๋ก์ง์ ๋ณด๋ฉฐ ์ถ์ธกํ ์ ์๋ค.
โพ Credentialed Request
์์ง ์จ๋ณด์ง ์์์ ... ์ฌ์ฉํด ๋ณธ ๋ค์์ ๋ด์ฉ์ ์ ๋ฆฌํ๊ฒ ๋ค
์ฐธ๊ณ > request-header ์ธ์ง response-header ์ธ์ง ๋ถ๋ณ์ ์ ํด์ผํ๋ค.
๐ CORS-safelisted request-header name
โ Accept
โ Accept-Language
โ Content-Language
โ Content-Type
๐ CORS-safelisted response-header name
โ Cache-Control
โ Content-Language
โ Content-Length
โ Content-Type
โ Expires
โ Last-Modified
โ Pragma
์ฐธ๊ณ ์๋ฃ
https://ko.javascript.info/fetch-crossorigin
https://kyu9341.github.io/WEB/2020/10/24/WEB_CORS/
https://developer.mozilla.org/en-US/docs/Glossary/CORS
https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Allow
https://sowells.tistory.com/170
https://fetch.spec.whatwg.org/#http-new-header-syntax
https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/how-to-cors.html
https://nodejs.org/ko/docs/guides/anatomy-of-an-http-transaction/
'Front-end > Browser' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ธ๋ผ์ฐ์ ์ Node JS : ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ ๋ค์ํ ๋ฐฉ๋ฒ๋ค (์ถ๊ฐ์ค) (0) | 2021.10.20 |
---|---|
Event Loop & Task queue ์ด๋ฒคํธ ๋ฃจํ์ ํ์คํฌ ํ (0) | 2021.09.18 |
URI ๊ทธ๋ฆฌ๊ณ URL, URN (0) | 2021.09.11 |
REST API ๊ธฐ๋ณธ ์ ๋ฆฌ (0) | 2021.09.08 |
๋ธ๋ผ์ฐ์ ๋ ๋๋ง ๊ณผ์ && ๊ฐ์ข ์ฉ์ด ์ ๋ฆฌ (0) | 2021.08.22 |
๋๊ธ