👉 즉 다른 출처에서 로드된 문서나 스크립트가 동일한 출처를 가진 문서와 자유롭게 상호 작용할 수 없도록 제한하는 정책으로 이는 공격자가 악의적인 스크립트를 사용하여 웹 페이지의 데이터를 탈취하는 것을 방지한다.
👉 예를 들어 URL이 https://www.naver.com/
이라면 네이버 출처의 리소스 https://www.naver.com/resource
만 접근이 가능하고 구글 출처의 리소스 https://www.google.com/some-resource
는 접근이 차단된다.
1. 프리플라이트 요청(Preflight Request)
👉 요청을 보내기 전에 미리 권한 확인을 할 수 있기 때문에, 실제 요청을 처음부터 통째로 보내는 것보다 리소스 측면에서 효율적이며, CORS에 대비가 되어있지 않은 서버를 보호할 수 있다.
2. 단순 요청 (Simple Request)
단순 요청이 가능한 조건(모두 만족해야 한다.)
- HTTP 메소드가 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)
- 클라이언트 측에서는 요청 헤더에
withCredentials : true
를 넣어야 한다.- 서버 측에서는 응답 헤더에
Access-Control-Allow-Credentials : true
를 넣어야 한다.- 서버 측에서
Access-Control-Allow-Origin
을 설정할 때, 와일드카드(*)로 설정하면 에러가 발생한다.
1. Node.js를 사용한 CORS의 설정
const http = require('http'); const server = http.createServer((request, response) => { // 모든 도메인에서 온 요청을 허용 response.setHeader("Access-Control-Allow-Origin", "*"); // 특정 도메인에서 온 요청만 허용 response.setHeader("Access-Control-Allow-Origin", "https://codestates.com"); // 인증 정보를 포함한 요청을 받을 경우 response.setHeader("Access-Control-Allow-Credentials", "true"); })
2. Express 프레임워크를 사용한 CORS의 설정
const cors = require("cors"); const app = express(); //모든 도메인온 요청을 허용 app.use(cors()); //특정 도메인에서 온 요청만 허용 const options = { origin: "https://www.naver.com", // 접근 권한을 부여하는 도메인 credentials: true, // 응답 헤더에 Access-Control-Allow-Credentials 추가 optionsSuccessStatus: 200, // 응답 상태 200으로 설정 }; app.use(cors(options)); //특정 요청 app.get("/example/:id", cors(), function (req, res, next) { res.json({ msg: "example" }); });