본문 바로가기
CS/네트워크

CORS(Cross-Origin Resource Sharing, 교차 출처 자원 공유)

by Mecodata 2024. 10. 23.

정의

- 웹 브라우저에서 다른 출처의 리소스에 대한 접근을 제어하기 위한 보안 메커니즘

- 웹 애플리케이션이 자신이 로드된 도메인과 다른 도메인에서 리소스를 요청할 때 이를 허용하거나 거부하는 방식

- CORS는 서버에서 설정하는 것이기 때문에 client에서는 완전히 제어할 수 없음

 

작동 방식

1. 프리플라이트 요청 - client가 실제 요청을 보내기 전에 OPTIONS http method를 사용하여 서버에 Preflight 요청

  • 서버는 클라이언트의 출처와 요청 메서드, 헤더를 기반으로 요청을 허용할지를 판단

2. 서버 응답 - 서버가 요청을 허용한다면 다음과 같은 응답 헤더를 포함

  • Access-Control-Allow-Origin: 허용된 출처 (예: *는 모든 출처를 허용).
  • Access-Control-Allow-Methods: 허용된 HTTP 메서드 목록 (예: GET, POST, PUT).
  • Access-Control-Allow-Headers: 허용된 요청 헤더 목록 (예: Content-Type, Authorization).
  • Access-Control-Max-Age: Preflight 요청의 유효 시간

3. 실제 요청 - 프리플라이트 요청이 허용되면 client에서 서버로 실제 요청 전송

 

 

프리플라이트(Preflight)

정의

- 웹 브라우저가 CORS 정책을 준수하기 위해 서버에 보내는 사전 요청

- 클라이언트가 서버에 실제 요청을 보내기 전에 서버가 특정 HTTP 요청을 허용하는지 확인하는 과정

Spring에서 @CrossOrigin({"*"}) 적용 시 → 프리플라이트는 정상적으로 자동 처리됨

(Access-Control-Allow-Origin, Access-Control-Allow-Methods, Access-Control-Allow-Headers가 자동으로 추가)

※ 프리플라이트 관련 문제 발생 시 대부분 OPTIONS 요청에 대한 정상 처리로 해결 가능

 

발생 조건

- http methodPUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH 사용

- Access-Control-Allow-Headers가 t ext/plain, multipart/form-data, application/x-www-form-urlencoded가 아님

Content-type을 application/json를 사용하면 프리플라이트 발생

- 요청에 사용되는 XMLHttpRequestUpload에 하나 이상의 EventListener 등록

 

발생하지 않는 조건 (단순 요청)

- http method GET, POST, HEAD 사용

- Accept, Accept-Language, Content-Language, Content-Type 이외의 헤더는 수정 X

- Access-Control-Allow-Headers가 text/plain, multipart/form-data, application/x-www-form-urlencoded

- 요청에 사용된 XMLHttpRequestUpload 객체에 EventListener가 등록 X

- 요청에 ReadableStream 객체가 사용 X

 

'CS > 네트워크' 카테고리의 다른 글

SSE, Polling, Socket  (0) 2024.04.26
KVM과 QEMU  (0) 2023.12.14
클러스터(Cluster)  (0) 2023.12.13
CLI vs REST 비교  (0) 2023.12.13
Ceph  (0) 2023.12.11

댓글