1. 개요

이 빠른 기사에서는 JAX-RS 기반 시스템 에서 CORS ( Cross-Origin Resource Sharing ) 를 활성화하는 방법에 대해 알아봅니다 . CORS 메커니즘 을 활성화하기 위해 JAX-RS 위에 애플리케이션을 설정할 것입니다 .

2. CORS 메커니즘을 활성화하는 방법

JAX-RS에서 CORS를 활성화할 수 있는 두 가지 방법이 있습니다. 첫 번째이자 가장 기본적인 방법은 모든 요청에서 런타임에 필요한 응답 헤더를 주입하는 필터를 만드는 것입니다. 다른 하나는 각 URL Endpoints에 적절한 헤더를 수동으로 추가하는 것입니다.

이상적으로는 첫 번째 솔루션을 사용해야 합니다. 그러나 그것이 옵션이 아닌 경우 더 많은 수동 옵션도 기술적으로 좋습니다.

2.1. 필터 사용

JAX-RS 에는 컨테이너 응답 필터에 의해 구현되는 ContainerResponseFilter 인터페이스가 있습니다. 일반적으로 이 필터 인스턴스는 모든 HTTP 응답에 전역적으로 적용됩니다.

이 인터페이스를 구현하여 나가는 각 요청에 Access-Control-Allow-* 헤더를 삽입하고 CORS 메커니즘을 활성화하는 사용자 지정 필터를 만듭니다.

@Provider
public class CorsFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, 
      ContainerResponseContext responseContext) throws IOException {
          responseContext.getHeaders().add(
            "Access-Control-Allow-Origin", "*");
          responseContext.getHeaders().add(
            "Access-Control-Allow-Credentials", "true");
          responseContext.getHeaders().add(
           "Access-Control-Allow-Headers",
           "origin, content-type, accept, authorization");
          responseContext.getHeaders().add(
            "Access-Control-Allow-Methods", 
            "GET, POST, PUT, DELETE, OPTIONS, HEAD");
    }
}

여기에 몇 가지 사항이 있습니다.

  • ContainerResponseFilter 를 구현하는 필터 는 JAX-RS 런타임에서 발견할 @Provider 로 명시적으로 어노테이션을 달아야 합니다.
  • ' Access-Control-Allow-* ' 헤더에 '*'를 삽입하고 있습니다. 즉, 이 서버 인스턴스에 대한 모든 URL Endpoints은 모든 도메인을 통해 액세스할 수 있습니다. 교차 도메인 액세스를 명시적으로 제한하려면 이 헤더에서 해당 도메인을 언급해야 합니다.

2.2. 각 Endpoints에 헤더 수정 사용

앞서 언급했듯이 엔드포인트 수준에서도 ' Access-Control-Allow-* ' 헤더를 명시적으로 삽입할 수 있습니다.

@GET
@Path("/")
@Produces({MediaType.TEXT_PLAIN})
public Response index() {
    return Response
      .status(200)
      .header("Access-Control-Allow-Origin", "*")
      .header("Access-Control-Allow-Credentials", "true")
      .header("Access-Control-Allow-Headers",
        "origin, content-type, accept, authorization")
      .header("Access-Control-Allow-Methods", 
        "GET, POST, PUT, DELETE, OPTIONS, HEAD")
      .entity("")
      .build();
}

여기서 주목해야 할 점은 대규모 애플리케이션에서 CORS 를 활성화하려는 경우 이 방법을 시도해서는 안 된다는 것입니다. 이 경우 헤더를 모든 URL Endpoints에 수동으로 삽입해야 하므로 추가 오버헤드가 발생합니다.

그러나 이 기술은 일부 URL Endpoints에서만 CORS 를 활성화해야 하는 애플리케이션에서 사용할 수 있습니다 .

3. 테스트

애플리케이션이 가동되면 curl 명령을 사용하여 헤더를 테스트할 수 있습니다. 샘플 헤더 출력은 아래와 같아야 합니다.

HTTP/1.1 200 OK
Date : Tue, 13 May 2014 12:30:00 GMT
Connection : keep-alive
Access-Control-Allow-Origin : *
Access-Control-Allow-Credentials : true
Access-Control-Allow-Headers : origin, content-type, accept, authorization
Access-Control-Allow-Methods : GET, POST, PUT, DELETE, OPTIONS, HEAD
Transfer-Encoding : chunked

또한 간단한 AJAX 함수를 만들고 도메인 간 기능을 확인할 수 있습니다.

function call(url, type, data) {
    var request = $.ajax({
      url: url,
      method: "GET",
      data: (data) ? JSON.stringify(data) : "",
      dataType: type
    });
 
    request.done(function(resp) {
      console.log(resp);
    });
 
    request.fail(function(jqXHR, textStatus) {
      console.log("Request failed: " + textStatus);
    });
};

물론 실제로 확인을 수행하려면 사용 중인 API와 다른 출처에서 이를 실행해야 합니다.

포트가 원본을 결정하므로 별도의 포트에서 클라이언트 앱을 실행하여 로컬에서 매우 쉽게 수행할 수 있습니다 .

4. 결론

이 기사에서는 JAX-RS 기반 애플리케이션에서 CORS 메커니즘을 구현하는 방법에 대해 설명했습니다.

항상 그렇듯이 전체 소스 코드는 GitHub에서 사용할 수 있습니다 .

Generic footer banner