SpringSecurity, JWT 로그인시 401 에러

Nam_JU·2022년 6월 4일
5

ErrorLog

목록 보기
19/26

에러배경

협업프로젝트의 코드개선을 하기위해 JWT를 다시 공부하여 적용했다. 문제는 SpringSecurity, JWT를 사용한 로그인을 프론트분이 진행했을때만 401에러가 떴다. 로컬상으로는 잘 돌아가는데 서버로 보낸 API로는 왜 이런 일이 일어난 걸까



401 Unauthorize이란

클라이언트가 인증되지 않았기 때문에 요청을 정상적으로 처리할 수 없다는 내용이다

403 Forbidden이란

서버가 해당 요청을 이해했지만 권한이 없어 요청이 거부되었음을 의미하는 상태이다

보통 403에러가 뜨는경우가 많은데 401에러가 뜨다니 처음 보는 에러라서 어떻게 접근을 해야할지 감잡기가 어려웠다.

가설을 세워보자

  • 403에러가 뜨지 않은 것으로 보아 서버의 권한문제는 아니다
  • 로컬에서는 정상적으로 로그인이 되었음으로 코드의 문제는 없었다
  • 프론트단에서 문제라면 어디에서 먼저 문제가 터진걸까?

해결방법

스프링시큐리티와 JWT를 설정하면 기본적으로 모든 요청마다 필터가 돌면서 권한을 확인한다. 로그인시에도 권한요청을 하는데 여기서 프런트의 URI가 접근이 안되서 생기는 문제라고 생각했다. 그래서 도출된 해결방식이 "/"에 대한 URI의 권한을 모두 허용시켜주는 것이다.

.antMatchers("/", "/**").permitAll() 추가

    @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

profile
개발기록

1개의 댓글

comment-user-thumbnail
2023년 3월 2일

안녕하세요 저를 살려주셨습니다 감사합니다......

답글 달기