Cross-Origin Request :
。특정 Origin에서 다른 Origin으로 HTTP Request를 전송하는것을 의미.
출처 : (Origin) :
。웹브라우저에서 Origin은 프로토콜 + 도메인 + 포트번호 를 조합한 값.
▶ https:// + example.com + :8080
CORS ( Cross-Origin Resource Sharing ) :
。 브라우저가 Cross-Origin Request의 허용여부를 결정하는 웹 보안정책.
▶ CORS가 존재하지 않으면, 브라우저가 Cross-Origin Request를 무조건 차단.
。다른 서버에서 해당 서버의 자원을 가져갈 지 결정하는 규칙
▶ 허용된 출처에서만 서버자원을 가져갈 수 있게 설정
。서버 - 서버 간 통신에는 적용되지 않으나, 브라우저 간 통신 시 CORS 정책이 적용
▶ 브라우저와 Spring이 통신 시 CORS 정책을 허용하는 코드를 정의
ex ) http://localhost:3000/ ( React )에서 http://localhost:8080/ ( Spring )으로 통신 시 CORS로 인한 Spring Security에 의해 차단.
▶ 리액트 : 포트 : 3000이므로, 스프링 : 포트 : 8080이므로, 포트가 다르기에 서로 다른 출처임에 따라서 CORS에 규약됨.
Spring Security에서는 기본적으로 다른 Origin으로부터의 Cross-Origin Request를 차단
。 필터 레벨에서 CORS 관련 설정을 수행하지 않는 경우, Spring Security Filter에 의해 다른 출처의 브라우저 로부터의 요청을 차단이 수행됨
▶ CORS 정책을 설정함으로써 특정 도메인에만 HTTP Request를 허용하도록 설정.
。Spring MVC 레벨에서의 WebMvcConfigurer에서 설정한 CORS 정책을 Spring Security가 참고 후 검증을 통해 Cross-Origin Request 허용
▶ CORS 정책에서 설정된 Origin, Method, Header 등을 기반으로 요청을 검증 후 허용
- 반드시
CORS를 설정하고, 외부 출처를 화이트리스트로서 추가해서 허용하는 방식으로 운용해야한다.
。Spring Security 범위는 *로만 하면 안되고, 화이트리스트를 통한 허용 범위를 설정하기
▶ CorsRegistry객체.allowedOrigins("URL명")을 통해 접속을 허락할 외부출처를 설정
Preflight Request :
。브라우저가 CORS Policy에 따라 서버에 실제 HTTP Request를 전달하기 전 사전에 확인용도로 OPTIONS Request Method를 사용하여 전달하는 요청
。Preflight Request는 CORS Policy가 적용될때, 특정 조건을 만족 시 자동으로 발생.
Preflight Request 발생 조건
。다음 조건을 만족하는 경우 Preflight Request 발생.
Cross-Origin :
。다른 URL의 출처( Origin )으로 요청 시 발생.
Simple Request에 해당하지 않는 경우.
。PUT , DELETE 등의 HTTP Method 또는 Authorization Header를 포함 시 Preflight Request 발생.
Simple Request :
。GET, HEAD , POST의 HTTP Method만 사용.
。Content-Type이 application/x-www-form-urlencoded, multipart/form-data, text/plain 중 하나
。Custom Header ( Authorization , X-Custom-Header )가 없는 경우
OPTIONS Request Method
。Server의 특정 Resource에서 허용하는 HTTP Method를 물어보는 용도의 Request.
▶ Client에서 해당 resource URL에서 사용할 수 있는 HTTP Method가 무엇인지 묻는 용도로 활용됨.