동일-출처 정책
SOP는 웹 환경에서의 보안 모델로, 동일한 출처의 URL과 데이터 접근만을 허용하는 정책이다
여기서 출처란, http://www.sample.com
과 같이 프로토콜, 호스트, 포트를 묶어서 부르는 것을 의미한다
위 예시에서는 http, www.sample.com, 80 을 사용하고 있다
따라서 아래와 같은 URL과는 데이터 접근을 허용하지 않는다
https://www.sample.com
http://www.sample.com:8080
이러한 SOP는 보안 정책 중의 하나로, 브라우저에서 제어된다
또한 이를 통해서 CSRF( Cross-Site Request Forgency )공격 등을 차단할 수 있다
실제로는 자원의 종류에 따라서 SOP가 다르게 적용된다
하지만 웹 애플리케이션 개발 시에는 보통 다른촐처간에 데이터를 공유하는 일이 발생한다
예를들어 프론트( React ) / 백엔드 ( Spring Boot ) 로 개발한다면 포트를 따로 둬야한다
이 때문에 SOP를 제어하기 위한 정책이 CORS( Cross-Site Resource Sharing ) 이다
교차-출처 자원 공유
CORS는 서버측에서 설정할 수 있으며, 동작과정은 간단하게 아래의 과정을 거친다
여기서 Access-Control-Allow-Origin 부분이 서버에서 설정할 수 있는 내용이다
configuration.addAllowedOrigin("http://localhost:3000");
configuration.setAllowedMethods(Arrays.asList("HEAD","POST","GET","DELETE","PUT"));
configuration.setAllowedHeaders(Arrays.asList("*"));
configuration.setAllowCredentials(true);
위 예시와 같이 허용할 출처, 메서드, 헤더 등을 설정할 수 있다
CORS의 동작방식은 크게 3가지의 시나리오가 존재한다
예비요청
본격적인 요청을 전송하기 이전에 통신이 정상적으로 동작하는지 확인하는 절차를 밟는다
이러한 확인요청을 preflight 라고 부르며 주로 OPTIONS 메서드가 사용된다
이러한 확인과정을 통해서 비정상적인 요청으로부터 서버측의 데이터를 지킬 수 있다는 장점이 존재한다
하지만, 통신의 과정에서 매번 preflight 요청을 보내는 것은 성능면에서 큰 단점이기 때문에 캐시를 통해 이러한 단점을 보완할 수 있다
Preflight Request과 다르게 바로 본요청을 보내고 CORS를 확인하는 방법이다
이러한 경우 서버측의 데이터가 변조될 가능성이 있기때문에 3가지 경우를 충족해야만 한다
서버측으로 자격인증정보( Credential ) 와 함께 요청을 보내는 방식으로, preflight과정이 일어난다
자격 인증 정보
쿠키 또는 Authorization 헤더의 토큰값 등을 의미한다
해당 방법을 사용하기 위해서는 클라이언트측과 서버측 모두에서 설정을 해야한다
먼저 클라이언트 측에는 요청시에 credentials
옵션을 작성해야한다
해당 옵션에는 총 3가지의 값을 사용할 수 있다
다음으로 서버측에서는 아래와 같은 방법으로 설정을 진행한다
Access-Control-Allow-Credentials
항목을 true로 설정해야 한다.Access-Control-Allow-Origin
의 값에 와일드카드 문자("*")는 사용할 수 없다.Access-Control-Allow-Methods
의 값에 와일드카드 문자("*")는 사용할 수 없다.Access-Control-Allow-Headers
의 값에 와일드카드 문자("*")는 사용할 수 없다.즉, 명확한 출처, 메서드, 헤더값을 명시해줘야한다