상황
스프링시큐리티, JWT를 사용해서 로그인을 구현했다. SecurityConfig와 JwtFilter, JwtSecurityConfig등 필요한 파일을 추가하고 가입과 로그인하면 토큰이 발급되는지도 확인했다.
문제는 .do가 붙지않은 요청을 보낼 때 401에러가 발생했다. 인증이 되지 않아서 발생한 문제고 무엇이 문제인지 확인해보았다.
시도한 방법
로그인해서 발급한 토큰을 postman에 등록했다.
tests에 변수를 등록하면 자동으로 등록이 된다는데 임시로 이렇게 했다. 저기 토큰에 들어가는건 로그인했을 때 발급한 토큰을 넣으면 된다.
토큰정보를 담아서 요청을 보냇는데 마찬가지로 401이 떳다. 액세스토큰을 보내면 안됐나?싶어서 리프레시토큰을 담아서 보냇는데도 마찬가지였다. 뭐가 문젠지 한참을 고민한끝에 결국 시큐리티문제인가 싶어서 시큐리티 설정을 계속 만졌다.
문제의 원인
JWT파일과 Config, TokenProvider를 추가했으면 시큐리티Config에 등록을 해야한다. 이 부분을 빼먹어서 토큰을 확인하지 못했다.
코드 맨 마지막에
.and()
.apply(new JwtSecurityConfig(tokenProvider));
이 코드를 추가하니 토큰 문제는 해결됐고 다른 문제가 발생했다.
상태코드200에 Body는 빈...
어떤 요청을 보내도 200으로 리턴했다. 로그도 찍히지 않았고 디버거도 잡히지 않아서 막막했다. 등록한 JwtSecirotyConfig의 문제이기때문에 시큐리티와 200리턴을 검색해서 원인을 찾아냈다.
https://developer-ping9.tistory.com/237
시큐리티에서 무조건 200을 리턴할 때는 config에 등록한 filter와 doFilter로 등록된 필터의 갯수 차이가 날때 발생한다.
필터는 재귀적으로 호출을 해서 필터의 갯수가 부족하다면 모두 순회하기 전에 기본 상태코드인 200을 리턴한다.
한마디로 내가 필터를 만들어서 doFilter를 만들었다면 FilterChain에 등록해야한다.
나는 JwtFilter를 만들어서 SecurityConfig에 등록했는데 JwtFilter안에 doFIlter에서 FilterChain에 내가 만든 필터를 등록하지 않아서 발생한 문제였다.
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//Request Header에서 토큰 정보 꺼내기
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);
}
하단의 chain.doFilter를 추가하니 정상적으로 작동했다.
'IT > 프로젝트 개발 중 발생한 에러' 카테고리의 다른 글
DockerCompose + SpringBoot + Mysql Connection refuse에러 (0) | 2022.09.22 |
---|---|
스프링시큐리티 + JWT 로그인 시 토큰 유효성검사 에러 (0) | 2022.09.19 |
AWS EC2 서버 이전시 발생한 이슈들 -SQLGrammarException: could not extract Result Set (0) | 2022.09.07 |
SQL 조인 개념 (0) | 2022.09.03 |
AWS EC2 ubuntu 배포 스프링부트 + React (0) | 2022.08.05 |