CORS 정책
포스트
취소

CORS 정책

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

  • 전역적으로 설정하는 방법
  • WebMvcConfigureraddCorsMappings를 통해 리소스 교환을 허용할 서버 목록을 지정할 수 있다.
  • 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 헤더가 *로 설정되지 않았는지 확인해야 한다.
      • 요청 원본과 명시적으로 일치해야 합니다.
  • maxAge
    • 캐싱 유효 시간을 지정할 수 있다.
    • 단위 : 초
@Override
public void addCorsMappings(CorsRegistry registry) {
    registry
        .addMapping("/**")
        .allowedOrigins(
            "서버 주소"
        )
        .allowedMethods(
            HttpMethod.GET.name(),
            HttpMethod.POST.name(),
            HttpMethod.PUT.name(),
            HttpMethod.DELETE.name()
        )
        .allowedHeaders(
            HttpHeaders.AUTHORIZATION,
            HttpHeaders.CONTENT_TYPE
        )
        //.exposedHeaders("...")
        .allowCredentials(true)
        .maxAge(3600);
}

@CrossOrigin

  • 지역적으로 설정하는 방법
  • @CrossOrigin 어노테이션을 통해 CORS 정책에 대한 처리를 지정한다.
  • 기본적으로 사용하는 방법은 위의 addCorsMappings과 동일하다.
  • 컨트롤러 클래스와 메소드에 사용할 수 있다.

출처

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.