Error zip

[Spring] JWT Filter 구현 중 NullPointerException 발생

JANNNNNN 2024. 6. 28. 12:32

에러

nio-8000-exec-4] o.a.c.c.C.[Tomcat].[localhost] : Exception Processing ErrorPage[errorCode=0, location=/error]
java.lang.NullPointerException: null

상황

JWT에서 필터 구현 테스트 중 갑자기 회원가입, 로그인 기능에서 계속 NullpointerException이 발생함..

근데 알아보니 Filter에서 문제가 발생했던 것이었다

해결책

- 원래 기존 MyFilter3

public class MyFilter3 implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse res = (HttpServletResponse) servletResponse;

        //로그 추가
        System.out.println("filter3 ====");
        // 만약, token을 검증하여, Controller에 접근 여부 설정!
        if (req.getMethod().equals("POST")) {
            String auth_header = req.getHeader("Authorization");

            if (auth_header.equals("secret")) { // 여기서 auth_header가 null이면 NullPointerException이 발생
                filterChain.doFilter(req, res);
            } else {
                PrintWriter writer = res.getWriter();
                writer.println("인증 안됨");
            }
        } else {
            filterChain.doFilter(servletRequest, servletResponse);
        }
    }
}

MyFilter3에서 NullPointerException이 발생했던 이유는 req.getHeader("Authorization")의 반환 값이 null일 때 auth_header.equals("secret")를 호출하기 때문입니다!

null 객체에서 메서드를 호출하려고 하면 NullPointerException이 발생합니다.

 

그래서 해결 방안을 찾아 코드를 다시 수정했습니다.

 

  • Authorization 헤더가 null인지 확인: auth_header가 null인지 확인하고, null일 경우 적절히 처리합니다.
  • null 안전 코드 작성: null을 안전하게 처리하기 위해 조건문을 추가합니다

- 수정된 Filter3

public class MyFilter3 implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse res = (HttpServletResponse) servletResponse;

        // 로그 추가
        System.out.println("Filter 3: Request received");

        if (req.getMethod().equals("POST")) {
            String auth_header = req.getHeader("Authorization");

            // 헤더가 null인지 확인
            if (auth_header != null && auth_header.equals("secret")) {
                filterChain.doFilter(req, res);
            } else {
                res.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                PrintWriter writer = res.getWriter();
                writer.println("인증 안됨");
            }
        } else {
            filterChain.doFilter(servletRequest, servletResponse);
        }
    }
}

 

 

  • null 확인 추가: auth_header가 null인지 확인하여 null일 경우 예외가 발생하지 않도록 조건문을 수정했습니다.
  • 안전한 코드 작성: null일 경우 적절한 응답을 반환하도록 수정했습니다.

해결완료🫠

 

정상적으로 join 함수가 실행됨!!

오늘의 교훈

Authorization 헤더가 존재하지 않을 때를 고려해 필터를 구현해야겠다 ~