CORS란?
- 교차 출처 리소스 공유 (직역)
- Cross-Origin Resource Sharing
- 간단하게 설명하면
출처가 다른 서버끼리 리소스를 주고 받을 때 보안을 위해 설정된 정책
이다.
Same Origin과 Cross Origin
Same Origin
- CORS 중에서 CO는 Cross Origin이고, Cross Origin은 출처가 다른 서버를 의미한다.
- 그렇다면 이 출처가 다른 서버라는 기준은 어떻게 정의되었을까?
- 사실은 간단하게 아래 3개의 요소만 확인하면 된다.
- 프로토콜
- 호스트
- 포트
- 즉, 해당 3개의 요소만 동일하다면 그 외의 값을 달라도 아무 상관없이 같은 출처로 인지한다.
Cross Origin
- Same Origin에서는 3개의 요소인 프로토콜, 호스트, 포트가 같아야 같은 출처라고 인지한다고 설명했다.
- 즉, Cross Origin이라는 것은 프로토콜, 호스트, 포트 중에서 무언가 다른 부분이 있다는 것이다.
- 다만, 출처가 다르다고 리소스를 주고 받지 못 하는 것은 아니다.
addCorsMappings
- 전역적으로 설정하는 방법
WebMvcConfigurer
의addCorsMappings
를 통해 리소스 교환을 허용할 서버 목록을 지정할 수 있다.- addMapping
- CORS를 적용할 URL 패턴을 정의한다.
- allowedOrigins
- 리소스 교환을 허용할 서버의 주소들을 나열하면 된다.
- *로 지정하면 모든 출처를 허용할 수 있다.
- 다만 이상한 출처의 요청을 받고 싶은 게 아니라면 굳이 그러지는 말자.
- allowedMethods
- 허용할 HTTP 메소드의 종류를 지정할 수 있다.
org.springframework.http.HttpMethod
를 통해 지정하면 가시성이 좋아진다.- *를 통해 모든 메소드를 허용할 수 있다.
- allowedHeaders
- 클라이언트 측의 CORS 요청에 허용될 HTTP 헤더의 종류를 지정할 수 있다.
org.springframework.http.HttpHeaders
를 통해 지정하면 가시성이 좋아진다.- 보통 Content-Type, Accept 및 Origin과 같은 간단한 요청 헤더만 허용한다.
- exposedHeaders
- 클라이언트 측 응답에서 노출될 헤더를 지정한다.
- allowCredentials
- 클라이언트 측에 대한 응답에 credentials를 포함할 수 있는지 여부를 지정한다.
- 쿠키나 인증 헤더가 해당한다.
- true일 경우
- 응답의 Access-Control-Allow-Origin 헤더가 *로 설정되지 않았는지 확인해야 한다.
- 요청 원본과 명시적으로 일치해야 합니다.
- 클라이언트 측에 대한 응답에 credentials를 포함할 수 있는지 여부를 지정한다.
- maxAge
- 캐싱 유효 시간을 지정할 수 있다.
- 단위 : 초
@CrossOrigin
- 지역적으로 설정하는 방법
- @CrossOrigin 어노테이션을 통해 CORS 정책에 대한 처리를 지정한다.
- 기본적으로 사용하는 방법은 위의 addCorsMappings과 동일하다.
- 컨트롤러 클래스와 메소드에 사용할 수 있다.