APP 에 접근이 가능한 사용자인지 확인
권한 을 확인하는 과정접근권한 여부 VS 권한 확인


무언가 를 이용한다.웹상에서 사용자 인증과 정보를 안전하게 교환하기위한 Token 스펙 (JSON 포맷이기 때문에 가볍다.)

Header :
Payload :
Signature


import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.FilterConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import java.io.IOException;
@Component
public class CustomFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 필터 초기화 로직 (필요하다면)
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
System.out.println("Request URI is: " + req.getRequestURI());
// 1. HTTP Request 가 들어오고나서 수행할 작업작성
// 2. 다음 필터로 요청을 전달
chain.doFilter(request, response);
// 3. HTTP Response 가 나가기 전에 수행할 작업작성
}
@Override
public void destroy() {
// 필터 종료 시의 로직 (필요하다면)
}
}
filterChain.doFilter(request, response) 메소드를 기준으로 진행이되고, 해당 메소드가없다면 바로 HTTP Response 가 반환된다.@RestController
@RequiredArgsConstructor
@RequestMapping("/auth")
public class AuthController {
private final MemberService memberService;
@PostMapping("/login")
public ResponseEntity<LoginResponseDto> login(@RequestBody LoginRequestDto req) {
LoginResponseDto resp = memberService.login(req);
return ResponseEntity.ok(resp);
}
}
@Component
@RequiredArgsConstructor
public class JwtAuthenticationFilter extends OncePerRequestFilter {
private final JwtHelper jwtHelper;
@Override
protected void doFilterInternal(HttpServletRequest req, HttpServletResponse resp, FilterChain chain) throws ServletException, IOException {
// 필터 실행여부 결정
if (!isFilterApplicable(req)) {
chain.doFilter(req, resp);
}
// Request Header 에서 AccessToken 추출
// 일반적인 형태 : "Authorization: Bearer xxxxyyyyyzzzz"
String accessToken = Optional.ofNullable(req.getHeader("Authorization"))
.map(header -> header.substring("Bearer ".length()))
.orElseThrow(() -> new UnAuthorizationException("Not Found AccessToken!"));
// AccessToken 에 대한 검증
if (!jwtHelper.validate(accessToken)) {
throw new UnAuthorizationException("Invalidate AccessToken!");
}
chain.doFilter(req, resp);
}
private boolean isFilterApplicable(HttpServletRequest req) {
String path = req.getRequestURI();
return path.startsWith("/api");
}
}
isFilterApplicable(req) : 해당 API가 실행되어야하는 요청인지 확인.header.substring("Bearer ".length())@Order(0)
@Component
public class AuthenticationExceptionHandlerFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest req, HttpServletResponse resp, FilterChain chain) throws ServletException, IOException {
try {
chain.doFilter(req, resp);
} catch (UnAuthorizationException authException) {
// 요구사항을 만족하기 위한 HTTP Response 데이터 세팅
resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
resp.getWriter().println(authException.getMessage());
}
}
}
