CORS에러가 뜨는 것을 경험하게 될 것이다.
CORS를 알아보기 전에, CORS가 필요하게 된 배경인 SOP먼저 알아보자!
SOP (Same-Origin Policy)
: 동일 출처 정책
: 같은 출처의 리소스만 공유가 가능하다.
여기서, '출처(Origin)'은 다음과 같다.
출처는 프로토콜, 호스트, 포트의 조합이다. 이 모든게 다 같아야 같은 출처로 취급한다.
예)
https://www.codestates.com vs http://www.codestates.com
⇒ 두 URI는 프로토콜이 다르기 때문에 동일 출처가 아닙니다. ( https / http )
https://urclass.codestates.com vs https://codestates.com
⇒ 두 URI는 호스트가 다르기 때문에 동일 출처가 아닙니다. ( urclass.codestates.com / codestates.com )
http://codestates.com:81 vs http://codestates.com
http 프로토콜의 기본 포트는 80입니다. 따라서 http://codestates.com 는 http://codestates.com:80 과 동일합니다.
⇒ 두 URI는 포트가 다르기 때문에 동일 출처가 아닙니다. ( :81 / :80 )
https://codestates.com:443 vs https://codestates.com
https 프로토콜의 기본 포트는 443입니다. 따라서 https://codestates.com 는 https://codestates.com:443 과 동일합니다.
⇒ 두 URI는 프로토콜, 호스트, 포트가 모두 같은 동일 출처입니다.
SOP은 왜 있는걸까?
그러나, 다른 출처의 리소스를 사용하게 될 일은 왕많다.
위 문제에서 필요한 것이 CORS다.
: Cross-Origin Resouce Sharing
: 교차 출처 리소스 공유
즉, 정리하자면 사실 이 에러는 SOP때문이고, 해결할 수 있는 방안이 CORS인 것!
CORS 동작 방식은 3가지가 있다.
1) 프리플라이트 요청 (Preflight Request)
2) 단순 요청 (Simple Request)
특정 조건이 만족되면 프리플라이트 요청을 생략하고 요청을 보내는 것으로, 이 조건들을 모두 만족시키긴 어렵다... 일단 참고만 하자!
조건들: GET, HEAD, POST 요청 중 하나여야 합니다.
자동으로 설정되는 헤더 외에, Accept, Accept-Language, Content-Language, Content-Type 헤더의 값만 수동으로 설정할 수 있습니다.
Content-Type 헤더에는 application/x-www-form-urlencoded, multipart/form-data, text/plain 값만 허용됩니다.
3) 인증정보를 포함한 요청 (Credentialed Request)
1) Node.js 서버
const http = require('http')
const server = http.createrServer((request, response)=>{
// 모든 도메인
response.setHeader("Access-Control-Allow-Origin", "*");
// 특정 도메인
response.setHeader("Access-Control-Allow-Origin", "https://naver.com");
// 인증 정보를 포함한 요청을 받을 경우
response.setHeader("Access-Control-Allow-Credential", "true");
})
2) Express 서버
const cors = require("cors")
const app = require("app")
//모든 도메인
app.use(cors());
//특정 도메인
const options = {
origin : "http://naver.com", //접근 권한을 부여하는 도메인
credentials: true;
optionSuccessStatus: 200,
};
app.use(options())
//특정 요청
app.get("/example/:id",cors(), function(req,res,next){
res.json({msg: "example"});
})
이 외 다양한 개발 환경에서도, 헤더의 값을 설정하는 방법만 알면 CORS 설정을 해줄 수 있다.