Troubleshooting

Spring: 로그인 - UserDetailsServiceImpl loadUserByUsername 문제

DuL2 2022. 8. 1. 17:13

발생한 문제

  • Spring Security 를 이용해 로그인을 만들던 도중 문제가 생겼다. AuthenticationManager 가 username과 password를 받아 처리해야하게끔 하려고 했다.
  • 그래서 WebSecurityConfig에 다음과 같이 처리하였다.
@Bean // Security 추가 설정하도록 빈 생성
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        // API (POST /api/**) 에 대해 CSRF 무시
        http.csrf()
                .ignoringAntMatchers("/**");
        http
                .authorizeHttpRequests((authz) ->
                        authz
                                .antMatchers("/images/**").permitAll() // image 폴더를 login 없이 허용
                                .antMatchers("/css/**").permitAll() // css 폴더를 login 없이 허용
                                .antMatchers("/signup").permitAll() // 회원가입 API 를 login 없이 허용
                                .antMatchers("/signin").permitAll() // 로그인 API 를 login 없이 허용
                                .anyRequest().authenticated()   // 어떤 요청이든 '인증'
                )
                    // 로그인 기능 허용
                    .formLogin()
//                    .loginPage("/user/login")
                    .loginProcessingUrl("/signin")
//                    .defaultSuccessUrl("/")
//                    .failureUrl("/user/login?error")
                    .permitAll()
                .and()
                //로그아웃 기능 허용
                    .logout()
                    .logoutUrl("/logout")
                    .permitAll();

        return http.build();
    }
  • postman으로 username과 password를 다음과 같이 보냈으나 자격 증명에 실패한다.

h2 DB에는 정상적으로 회원 가입되어 insert 된 것이 보이지만 로그인이 되질 않는다.

 

해결 및 시도 방법

  1. 맨처음에는 `/api/signin` 이라는 url을 사용하였는데 예약어인지 싶어서 혹시 몰라 `/api/signin1` 로 바꿔봤더니 UserDetails가 return 해왔다. 하지만 몇번의 테스트 이후에는 똑같은 환경이 아니었는지 되지 않았다.
    • 구글링으로 찾아보니 따로 예약어가 있는것 같지는 않았다.
  2. Debug를 해보았다. 실제 UserDetail을 만드는 과정(회원이 존재하는지 확인하는 과정)인 `loadUserByUsername(nickname)`이 잘 작동하는지 알아보았다.
    • nickname이 들어오지 않았다. 

 

문제점을 찾았다.

 

세부사항 변화

설마 Content 타입 때문인가 하여 fom-data로 넘겨 보니 해결됨.

기존

수정

결과

데이터 형식을 변경하여 send 하였더니 session이 열린것을 확인 할 수 있음.

회고

상당히 간단한 문제였는데 너무 오래 헤맸다. RestController로 작성을 하다보니 form-data 로 넘겨야 한다는 사실을 망각하였고, 돌고 돌아 겨우 해결하였다. 구글링을 꽤 오래 했는데 그 이유가 postman에서 Page Not Found 라는 response를 받아서 출력했고 본인은 그것을 URL Mapping이 잘못 된 것으로 인지하여 URL 문제에 대해서 구글링을 시작하였다. 

 

Page 에러가 뜨며 404 에러가 뜬 이유는 다름아닌 로그인 실패로 인하여 다시 로그인 페이지로 리다이렉트 시키는데 본인은 RestController만 만들어놔서 로그인 페이지가 없기 때문에 페이지가 뜨지 않는다는 오류가 나오는 것이 당연했다. 큰 흐름을 보지 못하고 앞에 놓인 결과만 붙잡다보니 문제 해결에 지장이 있었다. 다음부터는 문제를 해결하기 위해 한발자국 떨어져서 어떻게 Request와 Response가 작성되어 결과가 나왔는지 흐름을 확인하는 습관을 들여 해결해야 할 것 같다.

 

그래도 이번 트러블 슈팅으로 인하여 디버거와 조금 더 친해진 기분이다.

 

되도록 디버거와 덜 친해질 기회가 주어지는 것이 좋긴 하겠지만 ㅜㅜ......