JPA(Java Persistence API)에서 "Filter"는 엔터티(Entity)에 대한 특정 조건을 걸어 데이터를 필터링하는 데 사용되는 개념이다. JPA 자체에는 기본적으로 필터라는 기능이 없지만, Hibernate와 같은 JPA 구현체를 사용할 때는 @Filter 애노테이션을 활용해 엔터티에 필터링 로직을 적용할 수 있다.
🚀 @Filter 개념
@Filter는 특정 조건에 따라 엔터티를 자동으로 필터링하는 데 사용된다. 예를 들어, 활성화된 사용자만 조회하고 싶을 때, 해당 필터를 사용하면 쿼리마다 조건을 추가하지 않아도 된다. 필터는 주로 다중 테넌트(Multi-tenancy) 구조나 데이터에 대한 소프트 삭제(soft delete), 애플리케이션의 보안 인증(Authentication)과 권한 부여(Authorization) 같은 시나리오에서 유용하게 사용된다.
AuthFilter의 주요 기능
- 인증 확인(Authentication Check): 사용자가 유효한 인증 토큰(예: JWT, 세션 쿠키 등)을 가지고 있는지 확인한다. 유효한 토큰이 없으면 인증되지 않은 사용자의 요청으로 간주한다.
- 권한 부여(Authorization Check): 사용자가 요청한 리소스에 접근할 권한이 있는지 확인한다. 권한이 없으면 접근이 거부된.
- 로그인 리다이렉션(Login Redirect): 인증되지 않은 사용자가 보호된 리소스에 접근하려고 할 때 로그인 페이지로 리다이렉션할 수 있다.
- 요청 필터링(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 |