We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโll occasionally send you account related emails.
Already on GitHub? Sign in to your account
CORS(Cross-Origin Resource Sharing)๋ ์ถ์ฒ๊ฐ ๋ค๋ฅธ ์์๋ค์ ๊ณต์ ํ๋ค๋ ๋ป์ผ๋ก, ํ ์ถ์ฒ์ ์๋ ์์์์ ๋ค๋ฅธ ์ถ์ฒ์ ์๋ ์์์ ์ ๊ทผํ๋๋ก ํ๋ ๊ฐ๋ ์ ๋๋ค. ์ง์ญํ๋ฉด, ๊ต์ฐจ๋๋ ์ถ์ฒ ์์๋ค์ ๊ณต์ ์ ๋๋ค. ๋ค๋ฅธ ์ถ์ฒ์ ์๋ ์์์ ์์ฒญํ๋ค๊ณ ํ๋ฉด, ์ด๋ฅผ ๊ต์ฐจ ์ถ์ฒ ์์ฒญ์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
์ ๋ฆฌํ์๋ฉด,ย CORS๋ ๋๋ฉ์ธ์ด ๋ค๋ฅธ ์๋ฒ๋ผ๋ฆฌ ๋ฆฌ์์ค๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ๋ณด์์ ์ํด ์ค์ ๋ ์ ์ฑ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
๋ค๋ฅธ ์ถ์ฒ์ ์์์ ์ ๊ทผํด์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ค๋ ์๋ฏธ์ ๋๋ค.
๐ CORS์ ๊ด๋ จํด์ ์ฐ๋ฆฌ๊ฐ ๊ฐ๋ฐ์ ํ ๋ ๋ง์ฃผํ๋ ๋ฌธ์ !! ์น ํ๋ก ํธ ์๋์ api ์๋ฒ๋ฅผ ๋ฐ๋ก ๊ตฌ์ฑํ๋ ๊ฒฝ์ฐ, ํ๋ก ํธ ์๋์์ ๋ค๋ฅธ origin์ api ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ด๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
๐ย ํ์ง๋ง, Postman์ด๋ ์๋ฒ์์ ๊ฐ์ ์์ฒญ์ ๋ณด๋ด๋ฉด ํต๊ณผ๋๋ค! ์ ๊ทธ๋ด๊น? Postman์ด๋ ๋ฐฑ์๋์์๋ CORS ์ ์ฑ ์ ๋ฐ๋ฅด์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. CORS๋ ์ค๋ก์ง ๋ธ๋ผ์ฐ์ (ํฌ๋กฌ, ์ฃ์ง, ์ฌํ๋ฆฌ๊ฐ์ ํ๋ก ํธ์๋)๊ฐ ์ ์ฉํ๋ ๋ณด์ ์ ์ฑ ์ด๊ธฐ ๋๋ฌธ์ ์๋ฒ ์ฌ์ด์์๋ ์๋ฌด๋ฐ ๋ฌธ์ ์์ด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์ต๋๋ค.
๐ ์ถ์ฒ๋ ? ์์ฒญ์ ๋ณด๋ด๋ ์น์ฌ์ดํธ์ ์์ฒญ์ ๋ฐ๋ API ์๋ฒ์ ์ฃผ์
์์ ๊ตฌ์ฑ์์ ์ค์์ย Protocol + Host + Portย 3๊ฐ์ง๊ฐ ๊ฐ์ผ๋ฉด ๋์ผ ์ถ์ฒ(Origin)๋ผ๊ณ ํฉ๋๋ค.ย ๋ค๋ฅธ ๊ฒฝ์ฐ์ ๊ต์ฐจ ์ถ์ฒ(Cross-Origin) ๊ฐ ๋ฉ๋๋ค.
๋์ผ ์ถ์ฒ(Origin)
๊ต์ฐจ ์ถ์ฒ(Cross-Origin)
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์ ๋ฌธ์ ์ ์ฌ์ฉ์ฑ ํฅ์ ํ์์ฑ์์ ๋น๋กฏ๋์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ผ ์ถ์ฒ ์ ์ฑ (Same-origin policy)์ ๋ฐ๋ฆ ๋๋ค. Same-Origin Policy(๋์ผ ์ถ์ฒ ์ ์ฑ )์ ๋ณด์์ ์ํด ๋ธ๋ผ์ฐ์ ๊ฐ ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ๋ค๋ฅธ ๋๋ฉ์ธ(์ถ์ฒ)์ ๋ฆฌ์์ค์ ์ ๊ทผํ์ง ๋ชปํ๋๋ก ์ ํํ๋ ์ ์ฑ ์ ๋๋ค. ์ด ์ ์ฑ ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์์ ์ธ ์ฌ์ดํธ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ํ์น๊ฑฐ๋, ๋ฏผ๊ฐํ ์ ๋ณด์ ์ ๊ทผํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ์ค์ํ ๋ณด์ ์ฅ์น์ ๋๋ค.
๊ทธ๋ฌ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ณต์กํด์ง๊ณ ๋ถ์ฐํ๋๋ฉด์, ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋ก ํธ์๋์ ๋ฐฑ์๋๋ฅผ ๋ถ๋ฆฌํ์ฌ ๊ฐ๋ฐํ๋ ๋ฐฉ์์ด ๋ณดํธํ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด, https://example.com์์ ํธ์คํ ๋๋ ํ๋ก ํธ์๋๊ฐ https://api.example.com์์ ์ ๊ณต๋๋ API์ ํต์ ํ๋ ๊ตฌ์กฐ๊ฐ ์ผ๋ฐํ๋์์ต๋๋ค.
https://example.com
https://api.example.com
์ด ๊ฒฝ์ฐ, ๋์ผ ์ถ์ฒ ์ ์ฑ ์ ์ํด ๋ค๋ฅธ ์๋ธ๋๋ฉ์ธ์ ์ ๊ทผ์ด ์ฐจ๋จ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ฐ๋ผ์ ์๋ก ๋ค๋ฅธ ์ถ์ฒ ๊ฐ์ ๋ฆฌ์์ค ๊ณต์ ๋ฅผ ์์ ํ๊ฒ ํ์ฉํ ์ ์๋ ์๋ก์ด ๋ฉ์ปค๋์ฆ์ด ํ์ํด์ก์ต๋๋ค.
๋ฐ๋ผ์ CORS๊ฐ ๋ฑ์ฅํ์ต๋๋ค. !!
CORS๋ ์น ๋ณด์์ ํ์ ์์์ธ ๋์ผ ์ถ์ฒ ์ ์ฑ ์ ํ๊ณ๋ฅผ ๋ณด์ํ๊ณ , ๋์์ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค์ ์์ ํ๊ฒ ์ํธ์์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
๐ ๊ทธ๋ฐ๋ฐ ๋ง์ฝ CORS ์ ์ฑ ์ด ์๋ค๋ฉด ?
CORS ์ ์ฑ ์ด ์๊ณ ๋ชจ๋ ๋ค๋ฅธ ์ถ์ฒ ์์ฒญ์ด ๊ฐ๋ฅํ ๋ธ๋ผ์ฐ์ ๋ฅผ ์๊ฐํด๋ด ์๋ค.
CSRF(Cross-Site Request Forgery) ๊ณต๊ฒฉ ์ํ ์ฆ๊ฐ ๋ค๋ฅธ ์ฌ์ดํธ์์ ์ฌ์ฉ์์ ๊ถํ์ผ๋ก ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ ๊ทผํ๋ ์์ฒญ์ ๋ณด๋ผ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ์ํ ์น์ฌ์ดํธ์ ๋ก๊ทธ์ธํ ์ํ์์ ์ ์์ ์ธ ์น์ฌ์ดํธ๊ฐ ํด๋น ์ฌ์ฉ์์ ๊ถํ์ผ๋ก ์ํ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด ๊ณ์ข ์ด์ฒด๋ฅผ ํ ์ ์์ต๋๋ค.
๊ฐ์ธ ์ ๋ณด ์ ์ถ ๋ค๋ฅธ ๋๋ฉ์ธ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ์ค์ํ ๋ฐ์ดํฐ(์: ์ฌ์ฉ์ ์ธ์ , ์ธ์ฆ ํ ํฐ ๋ฑ)์ ์ ๊ทผํ ์ ์๊ฒ ๋ฉ๋๋ค. ์ด๋ ๊ฒ ๋๋ฉด ์ ์ฑ ์ฌ์ดํธ๊ฐ ์ฌ์ฉ์์ ๊ฐ์ธ ์ ๋ณด๋ฅผ ์์งํ๊ฑฐ๋, ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ํ์น ์ ์์ต๋๋ค.
API ๋จ์ฉ ์ ์ฑ ์ฌ์ดํธ๊ฐ API์ ์์ ๋กญ๊ฒ ์ ๊ทผํ์ฌ ์๋น์ค ์์์ ๋ฌด๋จ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์๊ฒ ๋ฉ๋๋ค. ์ด๋ ์๋น์ค ๋น์ฉ ์ฆ๊ฐ์ API ์ค์ฉ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
๋ณด์ ์ ์ฑ ๋ฌด๋ ฅํ CORS๋ ๋ธ๋ผ์ฐ์ ์์ ์๋ฒ ๊ฐ์ ์์ฒญ์ ๊ด๋ฆฌํ๊ณ ์ ์ดํ๋ ์ค์ํ ๋ณด์ ๋ฉ์ปค๋์ฆ์ ๋๋ค. CORS๊ฐ ์์ผ๋ฉด ์๋ฒ์ ์๋์ ์๊ด์์ด ๋ค์ํ ๋๋ฉ์ธ์์ ์๋ฒ์ ์ ๊ทผํ ์ ์๊ฒ ๋์ด ๋ณด์์ด ์ทจ์ฝํด์ง๋๋ค.
CORS ์ ์ฑ ์ด ์๋ค๋ฉด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์ ์์ค์ด ํฌ๊ฒ ๋ฎ์์ ธ ์ ์์ ์ธ ๊ณต๊ฒฉ์ ๋งค์ฐ ์ทจ์ฝํด์ง๋๋ค. CORS๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ํํ์ฌ, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ ํ๊ฒ ์ํธ์์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ ์ค์ํ ๋ณด์ ๊ธฐ๋ฅ์ ๋๋ค.
Origin
Access-Control-Allow-Origin
https://aaa.com
โ Simple Request ์กฐ๊ฑด
GET
POST
HEAD
text/plain
application/x-www-form-urlencoded
multipart/form-data
๐Simple Request ์์
GET /api/resource HTTP/1.1 # HTTP GET ์์ฒญ์ผ๋ก api.example.com ์๋ฒ์ /api/resource ๊ฒฝ๋ก์ ๋ฆฌ์์ค๋ฅผ ์์ฒญ Host: api.example.com # ์์ฒญ์ ๋ฐ๋ ์๋ฒ์ ํธ์คํธ๋ช (api.example.com) Origin: https://aaa.com # ์์ฒญ์ ๋ณด๋ธ ์ถ์ฒ์ ๋๋ฉ์ธ (https://aaa.com) # ์๋ฒ๊ฐ ํ์ฉ๋ ์ถ์ฒ์ธ์ง ํ์ธํ๋ ๋ฐ ์ฌ์ฉ
์ด ๊ฒฝ์ฐ, ๋ธ๋ผ์ฐ์ ๋ ์๋ฒ์ Access-Control-Allow-Origin์ด ์ค์ ๋ ์๋ต์ ํ์ธํฉ๋๋ค. ๋ง์ฝ ์๋ฒ๊ฐ ํด๋น ์ถ์ฒ๋ฅผ ํ์ฉํ๋ค๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์ด ์๋ต์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
โ Preflight๊ฐ ํ์ํ ๊ฒฝ์ฐ
PUT
DELETE
PATCH
Authorization
X-Custom-Header
application/json
โ Preflight Request ๊ณผ์
Access-Control-Allow-Methods
Access-Control-Allow-Headers
๐Preflight Request ์์
OPTIONS /api/resource HTTP/1.1 # OPTIONS ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ์ฌ์ ์์ฒญ์ ์ ์กํ์ฌ, DELETE ์์ฒญ์ ํ์ฉํ๋์ง ํ์ธ Host: api.example.com # ์์ฒญ์ ๋ฐ๋ ์๋ฒ์ ํธ์คํธ๋ช (api.example.com) Origin: https://aaa.com # ์์ฒญ์ ๋ณด๋ธ ์ถ์ฒ (https://aaa.com) # ์๋ฒ๊ฐ ํ์ฉ๋ ์ถ์ฒ์ธ์ง ํ์ธํ๊ธฐ ์ํด ํฌํจ Access-Control-Request-Method: DELETE # ๋ณธ ์์ฒญ์ ์ฌ์ฉํ HTTP ๋ฉ์๋๊ฐ DELETE์์ ์๋ฒ์ ์๋ฆผ Access-Control-Request-Headers: Content-Type # ๋ณธ ์์ฒญ์ ํฌํจ๋ ํค๋(Content-Type)๊ฐ ์๋์ง ์๋ฒ์ ์๋ฆผ
๐์๋ฒ์ ํ๋ฆฌํ๋ผ์ดํธ ์๋ต ์์:
HTTP/1.1 200 OK # ์ฌ์ ์์ฒญ์ ๋ํ ์๋ต์ด ์ฑ๊ณต์ ์ผ๋ก ํ์ฉ๋์์์ ๋ํ๋ด๋ ์ํ ์ฝ๋ 200 Access-Control-Allow-Origin: https://aaa.com # https://aaa.com ์ถ์ฒ์์์ ์์ฒญ์ ํ์ฉ Access-Control-Allow-Methods: DELETE # DELETE ๋ฉ์๋๋ฅผ ํ์ฉํจ์ ๋ช ์ Access-Control-Allow-Headers: Content-Type # Content-Type ํค๋๋ฅผ ํฌํจํ ์์ฒญ์ ํ์ฉ
๐๋ณธ ์์ฒญ ์ ์ก ์์:
DELETE /api/resource HTTP/1.1 # ์๋ฒ์ /api/resource ๊ฒฝ๋ก์ DELETE ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ์ค์ ๋ฐ์ดํฐ ์ญ์ ์์ฒญ์ ์ ์ก Host: api.example.com # ์์ฒญ์ ๋ฐ๋ ์๋ฒ์ ํธ์คํธ๋ช (api.example.com) Origin: https://aaa.com # ์์ฒญ์ ๋ณด๋ธ ์ถ์ฒ (https://aaa.com) Content-Type: application/json # ์์ฒญ ๋ณธ๋ฌธ์ด JSON ํ์์์ ๋ํ๋ด๋ Content-Type ํค๋
โ ์ธ์ฆ ์ ๋ณด ํฌํจ ์์ฒญ์ ์กฐ๊ฑด
credentials: 'include'
Access-Control-Allow-Credentials: true
์ฃผ์: Access-Control-Allow-Origin์ ์์ผ๋์นด๋ *๋ฅผ ์ฌ์ฉํ ์ ์๊ณ , ํน์ ๋๋ฉ์ธ๋ง ์ง์ ํด์ผ ํฉ๋๋ค.
๐์ธ์ฆ ์ ๋ณด ํฌํจ ์์ฒญ ์์
GET /api/secure-resource HTTP/1.1 # HTTP GET ์์ฒญ์ผ๋ก api.example.com ์๋ฒ์ /api/secure-resource ๊ฒฝ๋ก์ ๋ฆฌ์์ค๋ฅผ ์์ฒญ Host: api.example.com # ์์ฒญ์ ๋ฐ๋ ์๋ฒ์ ํธ์คํธ๋ช (api.example.com) Origin: https://aaa.com # ์์ฒญ์ ๋ณด๋ธ ์ถ์ฒ์ ๋๋ฉ์ธ (https://aaa.com) # ์๋ฒ๊ฐ ์ด ์ถ์ฒ์์์ ์์ฒญ์ ํ์ฉํ ์ง ํ์ธํ๊ธฐ ์ํด ํฌํจ Cookie: session_id=abc123 # ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ฆ ์ ๋ณด๋ฅผ ํฌํจํ ์์ฒญ์ ๋ณด๋ (์ฌ๊ธฐ์๋ ์ฟ ํค "session_id=abc123") # ๋ก๊ทธ์ธ ์ธ์ ์ด๋ ์ฌ์ฉ์ ์๋ณ์ ์ํด ์๋ฒ์ ์ฟ ํค๋ฅผ ์ ์ก
๐์๋ฒ์ ์๋ต ํค๋:
HTTP/1.1 200 OK # ์๋ฒ๊ฐ ์์ฒญ์ ์ฑ๊ณต์ ์ผ๋ก ์ฒ๋ฆฌํ์์ ๋ํ๋ด๋ ์ํ ์ฝ๋ 200 Access-Control-Allow-Origin: https://aaa.com # ์๋ฒ๊ฐ ์ด ์์ฒญ ์ถ์ฒ (https://aaa.com)๋ฅผ ํ์ฉํ๋ค๋ ๊ฒ์ ๋ช ์ # ์ธ์ฆ ์ ๋ณด ์์ฒญ ์, ๋ฐ๋์ ํน์ ์ถ์ฒ๋ง ์ง์ ํด์ผ ํ๋ฉฐ, * ์์ผ๋์นด๋๋ฅผ ์ฌ์ฉํ ์ ์์ Access-Control-Allow-Credentials: true # ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ฆ ์ ๋ณด๋ฅผ ํฌํจํ ์์ฒญ์ ํ์ฉํ๋๋ก ์ค์ # ๋ธ๋ผ์ฐ์ ๋ ์ด ํค๋๊ฐ ํฌํจ๋์ด ์์ด์ผ ์ฟ ํค๋ ์ธ์ ์ ๋ณด๋ฅผ ์ฌ์ฉํ ์ ์์
์ด๋ฌํ CORS ์์ฒญ ์ ํ์ ํตํด, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์์ ์ผ๋ก ์์ ํ๊ฒ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์์ต๋๋ค.
๋ ์์ธํ ๋ด์ฉ์ด ์๊ณ ์ถ๋ค๋ฉด !! +++ ์์ธ์์กฐ 5์ฃ ์๋ค๊ณผ์ ์ฝ๋ํ ํฌ ๋ด์ฉ์ ์ฐธ์กฐํ์ฌ ์์ฑํ์ต๋๋ค ใ ใ https://developer.mozilla.org/ko/docs/Web/HTTP/CORS
The text was updated successfully, but these errors were encountered:
No branches or pull requests
๐กCORS๋ ?
CORS(Cross-Origin Resource Sharing)๋ ์ถ์ฒ๊ฐ ๋ค๋ฅธ ์์๋ค์ ๊ณต์ ํ๋ค๋ ๋ป์ผ๋ก, ํ ์ถ์ฒ์ ์๋ ์์์์ ๋ค๋ฅธ ์ถ์ฒ์ ์๋ ์์์ ์ ๊ทผํ๋๋ก ํ๋ ๊ฐ๋ ์ ๋๋ค. ์ง์ญํ๋ฉด, ๊ต์ฐจ๋๋ ์ถ์ฒ ์์๋ค์ ๊ณต์ ์ ๋๋ค. ๋ค๋ฅธ ์ถ์ฒ์ ์๋ ์์์ ์์ฒญํ๋ค๊ณ ํ๋ฉด, ์ด๋ฅผ ๊ต์ฐจ ์ถ์ฒ ์์ฒญ์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
์ ๋ฆฌํ์๋ฉด,ย CORS๋ ๋๋ฉ์ธ์ด ๋ค๋ฅธ ์๋ฒ๋ผ๋ฆฌ ๋ฆฌ์์ค๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ๋ณด์์ ์ํด ์ค์ ๋ ์ ์ฑ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
๋ค๋ฅธ ์ถ์ฒ์ ์์์ ์ ๊ทผํด์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ค๋ ์๋ฏธ์ ๋๋ค.
๐ CORS์ ๊ด๋ จํด์ ์ฐ๋ฆฌ๊ฐ ๊ฐ๋ฐ์ ํ ๋ ๋ง์ฃผํ๋ ๋ฌธ์ !!
์น ํ๋ก ํธ ์๋์ api ์๋ฒ๋ฅผ ๋ฐ๋ก ๊ตฌ์ฑํ๋ ๊ฒฝ์ฐ, ํ๋ก ํธ ์๋์์ ๋ค๋ฅธ origin์ api ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ด๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
๐ย ํ์ง๋ง, Postman์ด๋ ์๋ฒ์์ ๊ฐ์ ์์ฒญ์ ๋ณด๋ด๋ฉด ํต๊ณผ๋๋ค! ์ ๊ทธ๋ด๊น?
Postman์ด๋ ๋ฐฑ์๋์์๋ CORS ์ ์ฑ ์ ๋ฐ๋ฅด์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. CORS๋ ์ค๋ก์ง ๋ธ๋ผ์ฐ์ (ํฌ๋กฌ, ์ฃ์ง, ์ฌํ๋ฆฌ๊ฐ์ ํ๋ก ํธ์๋)๊ฐ ์ ์ฉํ๋ ๋ณด์ ์ ์ฑ ์ด๊ธฐ ๋๋ฌธ์ ์๋ฒ ์ฌ์ด์์๋ ์๋ฌด๋ฐ ๋ฌธ์ ์์ด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์ต๋๋ค.
๐ ์ถ์ฒ๋ ?
์์ฒญ์ ๋ณด๋ด๋ ์น์ฌ์ดํธ์ ์์ฒญ์ ๋ฐ๋ API ์๋ฒ์ ์ฃผ์
์์ ๊ตฌ์ฑ์์ ์ค์์ย Protocol + Host + Portย 3๊ฐ์ง๊ฐ ๊ฐ์ผ๋ฉด
๋์ผ ์ถ์ฒ(Origin)
๋ผ๊ณ ํฉ๋๋ค.ย๋ค๋ฅธ ๊ฒฝ์ฐ์
๊ต์ฐจ ์ถ์ฒ(Cross-Origin)
๊ฐ ๋ฉ๋๋ค.๐กCORS์ ๋ฑ์ฅ๋ฐฐ๊ฒฝ
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์ ๋ฌธ์ ์ ์ฌ์ฉ์ฑ ํฅ์ ํ์์ฑ์์ ๋น๋กฏ๋์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ผ ์ถ์ฒ ์ ์ฑ (Same-origin policy)์ ๋ฐ๋ฆ ๋๋ค. Same-Origin Policy(๋์ผ ์ถ์ฒ ์ ์ฑ )์ ๋ณด์์ ์ํด ๋ธ๋ผ์ฐ์ ๊ฐ ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ๋ค๋ฅธ ๋๋ฉ์ธ(์ถ์ฒ)์ ๋ฆฌ์์ค์ ์ ๊ทผํ์ง ๋ชปํ๋๋ก ์ ํํ๋ ์ ์ฑ ์ ๋๋ค. ์ด ์ ์ฑ ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์์ ์ธ ์ฌ์ดํธ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ํ์น๊ฑฐ๋, ๋ฏผ๊ฐํ ์ ๋ณด์ ์ ๊ทผํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ์ค์ํ ๋ณด์ ์ฅ์น์ ๋๋ค.
๊ทธ๋ฌ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ณต์กํด์ง๊ณ ๋ถ์ฐํ๋๋ฉด์, ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋ก ํธ์๋์ ๋ฐฑ์๋๋ฅผ ๋ถ๋ฆฌํ์ฌ ๊ฐ๋ฐํ๋ ๋ฐฉ์์ด ๋ณดํธํ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด,
https://example.com
์์ ํธ์คํ ๋๋ ํ๋ก ํธ์๋๊ฐhttps://api.example.com
์์ ์ ๊ณต๋๋ API์ ํต์ ํ๋ ๊ตฌ์กฐ๊ฐ ์ผ๋ฐํ๋์์ต๋๋ค.์ด ๊ฒฝ์ฐ, ๋์ผ ์ถ์ฒ ์ ์ฑ ์ ์ํด ๋ค๋ฅธ ์๋ธ๋๋ฉ์ธ์ ์ ๊ทผ์ด ์ฐจ๋จ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ฐ๋ผ์ ์๋ก ๋ค๋ฅธ ์ถ์ฒ ๊ฐ์ ๋ฆฌ์์ค ๊ณต์ ๋ฅผ ์์ ํ๊ฒ ํ์ฉํ ์ ์๋ ์๋ก์ด ๋ฉ์ปค๋์ฆ์ด ํ์ํด์ก์ต๋๋ค.
๋ฐ๋ผ์ CORS๊ฐ ๋ฑ์ฅํ์ต๋๋ค. !!
CORS๋ ์น ๋ณด์์ ํ์ ์์์ธ ๋์ผ ์ถ์ฒ ์ ์ฑ ์ ํ๊ณ๋ฅผ ๋ณด์ํ๊ณ , ๋์์ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค์ ์์ ํ๊ฒ ์ํธ์์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
๐ ๊ทธ๋ฐ๋ฐ ๋ง์ฝ CORS ์ ์ฑ ์ด ์๋ค๋ฉด ?
CORS ์ ์ฑ ์ด ์๊ณ ๋ชจ๋ ๋ค๋ฅธ ์ถ์ฒ ์์ฒญ์ด ๊ฐ๋ฅํ ๋ธ๋ผ์ฐ์ ๋ฅผ ์๊ฐํด๋ด ์๋ค.
CSRF(Cross-Site Request Forgery) ๊ณต๊ฒฉ ์ํ ์ฆ๊ฐ
๋ค๋ฅธ ์ฌ์ดํธ์์ ์ฌ์ฉ์์ ๊ถํ์ผ๋ก ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ ๊ทผํ๋ ์์ฒญ์ ๋ณด๋ผ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ์ํ ์น์ฌ์ดํธ์ ๋ก๊ทธ์ธํ ์ํ์์ ์ ์์ ์ธ ์น์ฌ์ดํธ๊ฐ ํด๋น ์ฌ์ฉ์์ ๊ถํ์ผ๋ก ์ํ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด ๊ณ์ข ์ด์ฒด๋ฅผ ํ ์ ์์ต๋๋ค.
๊ฐ์ธ ์ ๋ณด ์ ์ถ
๋ค๋ฅธ ๋๋ฉ์ธ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ์ค์ํ ๋ฐ์ดํฐ(์: ์ฌ์ฉ์ ์ธ์ , ์ธ์ฆ ํ ํฐ ๋ฑ)์ ์ ๊ทผํ ์ ์๊ฒ ๋ฉ๋๋ค. ์ด๋ ๊ฒ ๋๋ฉด ์ ์ฑ ์ฌ์ดํธ๊ฐ ์ฌ์ฉ์์ ๊ฐ์ธ ์ ๋ณด๋ฅผ ์์งํ๊ฑฐ๋, ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ํ์น ์ ์์ต๋๋ค.
API ๋จ์ฉ
์ ์ฑ ์ฌ์ดํธ๊ฐ API์ ์์ ๋กญ๊ฒ ์ ๊ทผํ์ฌ ์๋น์ค ์์์ ๋ฌด๋จ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์๊ฒ ๋ฉ๋๋ค. ์ด๋ ์๋น์ค ๋น์ฉ ์ฆ๊ฐ์ API ์ค์ฉ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
๋ณด์ ์ ์ฑ ๋ฌด๋ ฅํ
CORS๋ ๋ธ๋ผ์ฐ์ ์์ ์๋ฒ ๊ฐ์ ์์ฒญ์ ๊ด๋ฆฌํ๊ณ ์ ์ดํ๋ ์ค์ํ ๋ณด์ ๋ฉ์ปค๋์ฆ์ ๋๋ค. CORS๊ฐ ์์ผ๋ฉด ์๋ฒ์ ์๋์ ์๊ด์์ด ๋ค์ํ ๋๋ฉ์ธ์์ ์๋ฒ์ ์ ๊ทผํ ์ ์๊ฒ ๋์ด ๋ณด์์ด ์ทจ์ฝํด์ง๋๋ค.
CORS ์ ์ฑ ์ด ์๋ค๋ฉด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์ ์์ค์ด ํฌ๊ฒ ๋ฎ์์ ธ ์ ์์ ์ธ ๊ณต๊ฒฉ์ ๋งค์ฐ ์ทจ์ฝํด์ง๋๋ค. CORS๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ํํ์ฌ, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ ํ๊ฒ ์ํธ์์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ ์ค์ํ ๋ณด์ ๊ธฐ๋ฅ์ ๋๋ค.
๐กCORS ๋์ ๊ณผ์
๐ CORS ๊ธฐ๋ณธ ํ๋ฆ
Origin
ํค๋์ ๋ด์ ์๋ฒ๋ก ๋ณด๋ ๋๋ค.Origin
ํค๋๋ ์์ฒญ์ด ์ด๋ ์ถ์ฒ(๋๋ฉ์ธ)์์ ์์๋์๋์ง ์๋ฒ์ ์๋ฆฌ๋ ์ญํ ์ ํฉ๋๋ค.Access-Control-Allow-Origin
ํค๋๋ฅผ ํตํด ๋ช ์ํฉ๋๋ค.Access-Control-Allow-Origin
ํค๋์ ์์ฒญํ ์ถ์ฒ(์:https://aaa.com
)๋ฅผ ์ค์ ํ๊ฑฐ๋, ๋ชจ๋ ์ถ์ฒ๋ฅผ ํ์ฉํ๋ ์์ผ๋์นด๋(``)๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.Access-Control-Allow-Origin
๊ฐ์ด ๋ธ๋ผ์ฐ์ ์ ์์ฒญ ์ถ์ฒ์ ์ผ์นํ๋ค๋ฉด, ๋ธ๋ผ์ฐ์ ๋ ํด๋น ์๋ต์ ํ์ฉํ๊ณ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.Access-Control-Allow-Origin
ํค๋๊ฐ ์์ผ๋ฉด, ๋ธ๋ผ์ฐ์ ๋ CORS ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๊ณ ์๋ต์ ์ฐจ๋จํฉ๋๋ค.๐ ์กฐ๊ธ ๋ ์์ธํ๊ฒ 3๊ฐ์ง ์๋๋ฆฌ์ค๊ฐ ์กด์ฌ !! CORS ์์ฒญ์ ์ ํ
1๏ธโฃ Simple Request (๋จ์ ์์ฒญ)
โ Simple Request ์กฐ๊ฑด
GET
,POST
,HEAD
์ค ํ๋์ฌ์ผ ํฉ๋๋ค.text/plain
,application/x-www-form-urlencoded
,multipart/form-data
์ค ํ๋๋ง ํฌํจํด์ผ ํฉ๋๋ค.๐Simple Request ์์
์ด ๊ฒฝ์ฐ, ๋ธ๋ผ์ฐ์ ๋ ์๋ฒ์
Access-Control-Allow-Origin
์ด ์ค์ ๋ ์๋ต์ ํ์ธํฉ๋๋ค. ๋ง์ฝ ์๋ฒ๊ฐ ํด๋น ์ถ์ฒ๋ฅผ ํ์ฉํ๋ค๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์ด ์๋ต์ ์ฌ์ฉํ ์ ์์ต๋๋ค.2๏ธโฃ Preflight Request (์ฌ์ ์์ฒญ)
โ Preflight๊ฐ ํ์ํ ๊ฒฝ์ฐ
PUT
,DELETE
,PATCH
๋ฑ ์๋ฒ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ฉ์๋์ธ ๊ฒฝ์ฐ.Authorization
์ด๋X-Custom-Header
๊ฐ์ ์ปค์คํ ํค๋๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ.application/json
๊ณผ ๊ฐ์ด ์ผ๋ฐ์ ์ด์ง ์์ ํน์ ํ์ ์ผ ๊ฒฝ์ฐ.โ Preflight Request ๊ณผ์
Origin
๊ณผ ์์ฒญ์ ์ฌ์ฉํ ๋ฉ์๋์ ํค๋์ ๋ํ ์ ๋ณด๋ฅผ ์๋ฒ์ ์ ๋ฌํฉ๋๋ค.Access-Control-Allow-Origin
,Access-Control-Allow-Methods
,Access-Control-Allow-Headers
๋ฑ์ ์๋ต ํค๋์ ํฌํจํ์ฌ, ํด๋น ์์ฒญ์ด ํ์ฉ๋๋์ง ์๋ ค์ค๋๋ค.๐Preflight Request ์์
๐์๋ฒ์ ํ๋ฆฌํ๋ผ์ดํธ ์๋ต ์์:
๐๋ณธ ์์ฒญ ์ ์ก ์์:
3๏ธโฃ ์ธ์ฆ ์ ๋ณด ํฌํจ ์์ฒญ (Credentials)
โ ์ธ์ฆ ์ ๋ณด ํฌํจ ์์ฒญ์ ์กฐ๊ฑด
credentials: 'include'
์ต์ ์ ์ค์ ํ์ฌ ๋ธ๋ผ์ฐ์ ๊ฐ ์ฟ ํค๋ ์ธ์ ๊ฐ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ํฌํจํ๋๋ก ๋ช ์ํฉ๋๋ค.Access-Control-Allow-Credentials: true
ํค๋๋ฅผ ์ถ๊ฐํด, ์ธ์ฆ ์ ๋ณด ํฌํจ ์์ฒญ์ ํ์ฉํ๊ฒ ๋ค๋ ์์ฌ๋ฅผ ํ์ํด์ผ ํฉ๋๋ค.๐์ธ์ฆ ์ ๋ณด ํฌํจ ์์ฒญ ์์
๐์๋ฒ์ ์๋ต ํค๋:
์ด๋ฌํ CORS ์์ฒญ ์ ํ์ ํตํด, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์์ ์ผ๋ก ์์ ํ๊ฒ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์์ต๋๋ค.
๋ ์์ธํ ๋ด์ฉ์ด ์๊ณ ์ถ๋ค๋ฉด !!
+++ ์์ธ์์กฐ 5์ฃ ์๋ค๊ณผ์ ์ฝ๋ํ ํฌ ๋ด์ฉ์ ์ฐธ์กฐํ์ฌ ์์ฑํ์ต๋๋ค ใ ใ
https://developer.mozilla.org/ko/docs/Web/HTTP/CORS
The text was updated successfully, but these errors were encountered: