Spring

[SpringBoot]Jpa Auth Filter

codi-3 2024. 8. 26. 20:44

JPA(Java Persistence API)에서 "Filter"는 엔터티(Entity)에 대한 특정 조건을 걸어 데이터를 필터링하는 데 사용되는 개념이다. JPA 자체에는 기본적으로 필터라는 기능이 없지만, Hibernate와 같은 JPA 구현체를 사용할 때는 @Filter 애노테이션을 활용해 엔터티에 필터링 로직을 적용할 수 있다.


🚀 @Filter 개념

@Filter는 특정 조건에 따라 엔터티를 자동으로 필터링하는 데 사용된다. 예를 들어, 활성화된 사용자만 조회하고 싶을 때, 해당 필터를 사용하면 쿼리마다 조건을 추가하지 않아도 된다. 필터는 주로 다중 테넌트(Multi-tenancy) 구조나 데이터에 대한 소프트 삭제(soft delete), 애플리케이션의 보안 인증(Authentication)과 권한 부여(Authorization) 같은 시나리오에서 유용하게 사용된다.


AuthFilter의 주요 기능

  1. 인증 확인(Authentication Check): 사용자가 유효한 인증 토큰(예: JWT, 세션 쿠키 등)을 가지고 있는지 확인한다. 유효한 토큰이 없으면 인증되지 않은 사용자의 요청으로 간주한다.
  2. 권한 부여(Authorization Check): 사용자가 요청한 리소스에 접근할 권한이 있는지 확인한다. 권한이 없으면 접근이 거부된.
  3. 로그인 리다이렉션(Login Redirect): 인증되지 않은 사용자가 보호된 리소스에 접근하려고 할 때 로그인 페이지로 리다이렉션할 수 있다.
  4. 요청 필터링(Request Filtering): 특정 URL 패턴에 대해 필터링을 적용하여, 인증 또는 권한 확인이 필요한 요청과 그렇지 않은 요청을 구분한다.

🔡 Java에서 AuthFilter 구현 예시

Spring Security 또는 Servlet Filter를 사용하여 AuthFilter를 구현할 수 있다. 아래는 Java Servlet Filter를 사용하여 간단한 인증 필터를 구현한 예시다.

 

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class AuthFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 초기화 로직이 필요하다면 여기에 작성
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        // 인증 토큰 확인 (여기서는 간단한 예로 Authorization 헤더를 사용)
        String authHeader = httpRequest.getHeader("Authorization");

        if (authHeader == null || !isValidToken(authHeader)) {
            // 인증 실패 시 401 응답
            httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Authentication required");
            return;
        }

        // 인증 성공 시 다음 필터로 요청 전달
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // 리소스 정리 로직이 필요하다면 여기에 작성
    }

    // 토큰 검증 로직 (실제로는 더 복잡할 수 있음)
    private boolean isValidToken(String token) {
        // 여기서 실제 토큰 검증 로직을 구현
        return "VALID_TOKEN".equals(token); // 예시로 간단한 검증 로직 작성
    }
}

주요 포인트

  • init(FilterConfig filterConfig): 필터 초기화 메서드로, 필터가 초기화될 때 한 번 호출된다.
  • doFilter(ServletRequest request, ServletResponse response, FilterChain chain): 필터의 핵심 메서드로, 각 요청이 필터를 거칠 때마다 호출된다. 여기서 인증 및 권한 검사를 수행한다.
  • destroy(): 필터가 종료될 때 호출된다. 주로 리소스를 정리하는 데 사용된다.

AuthFilter의 활용

  • API 보호: RESTful API에서 클라이언트 요청이 인증되었는지 확인하고, 권한이 있는 사용자만 특정 엔드포인트에 접근할 수 있도록 보호한다.
  • 웹 애플리케이션 보안: 사용자 세션을 관리하고, 로그인된 사용자만 특정 페이지에 접근할 수 있도록 한다.
  • 로그 기록: 인증 및 권한 검사를 수행하는 동시에 보안 관련 로그를 기록할 수 있다.

 

AuthFilter는 보안이 중요한 애플리케이션에서 필수적인 요소다. 사용자의 신원을 확인하고, 그들이 요청한 리소스에 접근할 권한이 있는지 확인함으로써 애플리케이션의 보안을 강화할 수 있다

'Spring' 카테고리의 다른 글

[SpringBoot] NaverOpen API 사용  (0) 2024.08.29
[SpringBoot]환경변수 application.properties  (0) 2024.08.28
[SpringBoot] Cookie & JWT  (0) 2024.08.21
[Spring Boot] JpaRepository  (0) 2024.08.20
[Springboot] IOC Container & Beans  (0) 2024.08.19