Spring/오류

[Error/오류] OAuth2 오류, JWT 오류 / java.lang.NullPointerException: Cannot read the array length because "<local6>" is null

Jin_____w 2024. 7. 17. 17:44

 

문제 상황

 

- OAuth2 + JWT를 적용한 프로젝트를 실행 시키고 로그인 페이지에 접속 시도 했을 때 오류 발생

- 어제는 잘 됐음

 

 


 

원인

 

 

 

 

JWT로 구현한 access와 refresh token은 현재 cookie로 사용 중이다.

 

오류가 발생한 시점에 설정한 security config는 모든 API 요청을 사용자 인증을 거치도록 구현 되어 있다.

 

사용자 인증은 access token 값이 포함된 cookie를 통해 jwtFilter의 사용자 인증 정보 확인 로직을 거쳐야되는데 

 

 access, refresh token이 포함되어 있는 cookie가 만료 기한이 지나 삭제된 상황이다.

 

그러나 cookie를 재발급하는 로직이 현재 미구현 상태이고 security config의 인가 설정에서도 login 인증 후 가능하도록(쿠키가 존재해야) 설정해놔서 login이 안 되서 새로운 cookie를 발급하는 것도 못하는 상황 발생

 


 

해결 시도

 

1. security config에서 login, logout endpoint permitAll

 

 

해결 X 

 

 

2. anyRequest().authenticated() 제거

 

 

해결 X

 

 

3. authorizeHttpRequests method 주석 처리

 

 

해결 X

 

 

4. sessionManagement 설정 변경, 주석 처리

 

 

둘 중에 하나, 모두 주석 처리 해봤으나 해결 X

 

 

5. (해결 방법) JwtFilter에 cookie null check 로직 추가

 

 

 

알고보니 이게 근본적인 문제 였는 듯..

 

JwtFilter class에 기존에 없었던 cookie null check 로직을 추가하니 원래 문제라고 생각했던 error log와 error page는 뜨지 않음

 

근데 http가 200 반환하고 page도 뜨는데 아무것도 없는 흰색 화면만 뜸

 

url request시 log를 출력하도록 하고 확인해보니 security 미적용 endpoint로 설정한 /favicon.ico가 호출 되고 있음

 

기존에 정상적으로 작동할 땐 호출이 안 됐음

 

이젠 이 문제를 해결해야함

 

 

5-1. JwtFilter cookie null check 로직 수정

 

 

 

가져온 쿠키가 null 일 때 그냥 return 했던 것을 다음 필터 진행 로직을 추가

 

이번엔 위에서 발생했던 아무것도 없는 흰색 화면이 뜨는 오류는 발생하지 않는데 리다이렉트 오류 발생..

 

 

5-2. 1번 시도 처럼 login endpoint를 permitAll

 

 

 

어제는 login endpoint를 permitAll 하지 않고 해도 됐었던 것 같은데 어쨌든 해결..

 


 

해결 방법 및 정리

 

- OAuth2 + JWT를 적용하고 API를 요청할 때 doFilterInternal method가 있는 JwtFilter 같은 class로 사용자 인증 정보 확인 시 accessToken을 cookie로 사용하고 있다면 반드시 cookie가 null인 경우의 처리 로직을 추가 해야 한다. null인 경우에는 filterChain.doFilter method를 호출해 filterChain의 다음 필터를 진행 하도록 구현한다. 

 

- 별도의 oauth2 login page를 설정했다면 login 성공 전에는 사용자 인증 정보가 서버에 저장되지 않은 상태이므로 login page를 return하는 endpoint를 permitAll로 설정해둔다. 

 

- accessToken을 cookie로 사용시 비동기적으로 재발급하고 쿠키를 관리하는 로직을 구현 해야한다.