협업프로젝트의 코드개선을 하기위해 JWT를 다시 공부하여 적용했다. 문제는 SpringSecurity, JWT를 사용한 로그인을 프론트분이 진행했을때만 401에러가 떴다. 로컬상으로는 잘 돌아가는데 서버로 보낸 API로는 왜 이런 일이 일어난 걸까
클라이언트가 인증되지 않았기 때문에 요청을 정상적으로 처리할 수 없다는 내용이다
서버가 해당 요청을 이해했지만 권한이 없어 요청이 거부되었음을 의미하는 상태이다
보통 403에러가 뜨는경우가 많은데 401에러가 뜨다니 처음 보는 에러라서 어떻게 접근을 해야할지 감잡기가 어려웠다.
스프링시큐리티와 JWT를 설정하면 기본적으로 모든 요청마다 필터가 돌면서 권한을 확인한다. 로그인시에도 권한요청을 하는데 여기서 프런트의 URI가 접근이 안되서 생기는 문제라고 생각했다. 그래서 도출된 해결방식이 "/"에 대한 URI의 권한을 모두 허용시켜주는 것이다.
@Override
protected void configure(HttpSecurity http) throws Exception {
// http.addFilterBefore(new MyFilter1(), BasicAuthenticationFilter.class);
http
.cors()
.configurationSource(corsConfigurationSource())
.and()
// .addFilter(corsConfig.corsFilter())//모든 요청은 필터를 거친다(인증이 필요할때 사용), @CorsOrigin 은 인증이 필요없을때 사용
.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) //세션을 사용하지 않겠다
.and()
.formLogin().disable() //폼로그인 안쓰겠다
.httpBasic().disable() //기본 인증방식 사용 X
.addFilter(new JwtAuthenticationFilter(authenticationManager())) //필터 추가 , AuthenticationManager 파라미터 필요
.addFilter(new JwtAuthorizationFilter(authenticationManager(), userRepository))
.authorizeRequests()
.antMatchers("/", "/**").permitAll() <--!!! 추가
.antMatchers("/api/v1/user/**")
.access("hasRole('ROLE_USER') or hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
.antMatchers("/api/v1/manager/**")
.access("hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
.antMatchers("/api/v1/admin/**")
.access("hasRole('ROLE_ADMIN')")
.anyRequest().permitAll()
;
}
참고자료
https://mangkyu.tistory.com/146
https://stackoverflow.com/questions/70414505/error-401-unauthorized-in-spring-boot-spring-security
안녕하세요 저를 살려주셨습니다 감사합니다......