반응형
상황
시큐리티와 JWT토큰을 사용해서 구현하던 중 로그인 시 유효하지않은 토큰이라는 에러가 발생했다. 로그인을 하면 토큰을 발급하고 인증이 필요한 요청에 토큰을 담아서 유효성검사를 하는데 인증이 필요하지 않는 로그인때부터 갑자기 토큰검사를해서 도대체 뭐가 문젠가 싶어서 한참을 헤맸다.
시도해본 방법
시큐리티Config 최하단에
.and()
.apply(new JwtSecurityConfig(tokenProvider));
아래와 같이 돼있는 코드를 addBeforeFilter로 수정하려고 했는데 JwtSecurityConfig안에 이미 addBeforeFilter가 구현돼있었다.
이후 TokenProvider와 로그인시 Service함수에서 수행하는 doLogin등을 다 수정해봤지만 도통 무슨에런지 찾을 수 없었다.
원인이 무엇인지 아는데 해결법을 찾을 수 없었다. 문제의 원인은
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
String jwt = resolveToken(httpServletRequest);
String requestURI = httpServletRequest.getRequestURI();
// 유효성 검사 후 정상이면 Authentication을 SecurityContext에 저장
if(StringUtils.hasText(jwt) && tokenProvider.validateToken(jwt)){
Authentication authentication = tokenProvider.getAuthentication(jwt);
SecurityContextHolder.getContext().setAuthentication(authentication);
logger.debug("Security Context에 '{}' 인증 정보를 저장했습니다, uri: {}", authentication.getName(), requestURI);
} else{
logger.debug("유효한 JWT 토큰이 없습니다, uri: {}", requestURI);
}
chain.doFilter(request, response);
상단의 String jwt에서 null이 발생해서 else문이 뜨는거였고 애초에 login은 doFilter를 타면 안된다. SecurityConfig에서 예외처리가 잘못됐을까봐 /**.do대신에 직접 url을 줬지만 에러가 발생했다.
해결
문제의 원인은 Postman이었다. 작업후에 권한이 필요한 부분에서 Auth의 헤더부분에 토큰을 변수로 삽입했고 Tests에서 토큰을 읽어서 처리하는거였는데 login요청할 때도 헤더에 token이 삽입됐고 로그인할 때는 토큰이 발급만되니까 자동으로 token은 null이되고 시큐리티에서는 헤더의 Authorization 부분이 null이긴 하지만 값이 들어있으니 자동으로 필터를 타는거였다.
반응형
'IT > 프로젝트 개발 중 발생한 에러' 카테고리의 다른 글
도커컴포즈 + 스프링부트 + nginx + react 404 에러 (0) | 2022.09.26 |
---|---|
DockerCompose + SpringBoot + Mysql Connection refuse에러 (0) | 2022.09.22 |
스프링시큐리티 401에러와 body가 빈 상태코드 200리턴 (0) | 2022.09.16 |
AWS EC2 서버 이전시 발생한 이슈들 -SQLGrammarException: could not extract Result Set (0) | 2022.09.07 |
SQL 조인 개념 (0) | 2022.09.03 |