[java] Java Jersey에서 특정 경로에 대한 권한 부여 필터를 구현하는 방법은?

Java Jersey는 웹 애플리케이션 개발을 위한 프레임워크로, RESTful 웹 서비스를 구축하는 데 유용합니다. 특정 경로에 대한 권한 부여 필터를 구현하는 방법을 알아보겠습니다.

먼저, Jersey에서 권한 부여 필터를 구현하기 위해 ContainerRequestFilter 인터페이스를 구현한 클래스를 작성해야 합니다. 이 필터는 HTTP 요청이 들어올 때마다 호출되어 특정 경로에 대한 권한 확인 로직을 처리합니다.

import javax.annotation.Priority;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.Provider;

@Provider
@Priority(1000)
public class AuthorizationFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext requestContext) {
        // 권한 부여 로직을 작성합니다.
        // 예를 들면, 토큰 확인 같은 로직을 수행합니다.
        
        // 특정 요청에 대해 권한이 없는 경우 거부 응답을 반환합니다.
        if (!hasPermission(requestContext)) {
            requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).entity("Access denied").build());
        }
    }

    private boolean hasPermission(ContainerRequestContext requestContext) {
        // 권한 확인 로직을 작성합니다.
        // 예를 들면, 사용자의 권한 정보를 확인하고 특정 경로에 대한 접근 여부를 판단합니다.
        // 필요한 경우 requestContext에 접근하여 헤더, 파라미터 등을 확인할 수 있습니다.
        // 필요한 경우 사용자 정보를 DB 등에서 조회하여 권한 여부를 판단할 수도 있습니다.
        return true; // 여기에서 실제 권한 확인 로직을 수행하고 결과를 반환합니다.
    }
}

위의 코드는 Jersey에서 권한 부여 필터를 구현하기 위한 예시입니다. AuthorizationFilter 클래스는 ContainerRequestFilter를 구현하고 @Provider 어노테이션을 추가하여 필터로 등록합니다. @Priority 어노테이션은 필터의 우선순위를 지정하는데, 숫자가 낮을수록 우선순위가 높습니다.

filter() 메서드는 HTTP 요청이 들어올 때마다 호출되며, 여기에서 특정 경로에 대한 권한 확인 로직을 작성합니다. 만약 권한이 없는 경우, requestContext.abortWith() 메서드를 이용하여 거부 응답을 반환합니다.

따라서 위의 예시에서는 hasPermission() 메서드에서 권한 확인 로직을 구현하고 true를 반환하도록 되어있습니다. 여기에서 실제 권한 확인 로직을 구현하고, 필요에 따라 requestContext를 이용하여 요청 정보를 확인할 수 있습니다.

이렇게 구현된 권한 부여 필터는 Jersey에서 특정 경로에 대한 요청이 들어올 때마다 호출되어 권한 확인 작업을 수행하게 됩니다.

참고 자료: