반응형
교차 출처 리소스 공유 (CORS)
- Cross-Origin Resource Sharing
- 추가 HTTP 헤더를 사용해, 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제
- 기본적으로 브라우저는 교차 출처 HTTP 요청을 제한
- SOP(Same-Origin Policy) - 동일 출처 정책
사용 사례
- XMLHttpRequest, Fetch API
- 웹 폰트
- WebGL
- drawImage()를 사용해 캔버스에 그린 이미지/비디오 프레임
- 이미지로부터 추출하는 CSS Shapes
개요
- HTTP 헤더 추가
OPTIONS
메소드로 preflight 요청- 승인 시 실제 요청 전송 / 서버는 클라이언트에게 인증정보를 요구할 수 있음
시나리오
단순 요청 (Simple requests)
- preflight 트리거하지 않음
- 조건이 까다로워 거의 발생하지 않음
- 클라이언트 헤더에
Origin
을 넣어 어디로부터 요청이 왔는지 서버가 확인 후 서버는Access-Control-Allow-Origin
헤더를 전송
조건
- GET, HEAD, POST 중 하나의 메소드
- 자동 설정 헤더 (
Accept
,Accept-Language
,Content-Language
등..)만 있어야 함 Content-Type
헤더에는application/x-www-form-urlencoded
,multipart/form-data
,text/plain
만 가능
프리플라이트 (preflight)
OPTIONS
메소드를 통해 다른 도메인의 리소스로 HTTP 요청을 보내 실제 요청이 전송하기에 안전한지 확인Access-Control-*
에 본 요청에 사용될 도메인, 메소드, 헤더 등을 알려줘 서버에서 일치 여부를 확인- ex /
Access-Control-Request-Method: POST
- ex /
- 요청에 사용자 헤더인 인증토큰이 들어가지 않기 때문에 별도로 서버에서
OPTIONS
메소드를 분기 처리 해주어야 함 - preflight 이후 리다이렉트를 모든 브라우저에서 지원하지 않기 때문에, 리다이렉트를 방지하는 코드를 서버에 넣어주거나 simple request가 되도록 코드를 변경해 사용할 수 있음
인증 정보를 포함한 요청
credentialed request
- 기본적으로 브라우저 호출 API는 인증 정보를 보내주지 않기 때문에
withCredentials: true
플래그를 추가 해야 함 / 이를 통해 스크립트로 쿠키에 직접 접근하는 경우를 방지하며, 서버에서도 헤더에Access-Control-Allow-Credentials: true
를 설정해야 함 - 이 때
Access-Control-Allow-Origin
는 와일드카드(*)가 아니어야 함
출처: MDN