24.1.9 TIL

전주현·2024년 1월 10일

TIL

목록 보기
20/21

1. 오늘 한 것

  • 로그인 인증 인가

2. 로그인 인증 인가

  • 여태까지 프로젝트를 진행하면서 인증 인가 부분은 내 마음대로 골라 쓴다고 authenticationfilter를 구현해 본적이 없었는데 이번에 거의 처음으로 구현을 시작해보았다.

  • 인증 인가를 진행하면서 사소하지만 오래 걸렸던 문제가 두개 있다.

    1. SecurityFilterChain 에서 yml 정보 바로 못 읽어 오는 문제

    http.authorizeHttpRequests(
        (authorizeHttpRequests) ->
            authorizeHttpRequests
                .requestMatchers(
                    PathRequest.toStaticResources().atCommonLocations())
                    .permitAll()
    // 이 방법이 문제 .requestMatchers("/api/{mpt.version}/users/signup/").permitAll()
    // 해결한 방법    .requestMatchers("/api/" + versionConfig.getVersion() + "/users/signup/**").permitAll()
                    .anyRequest().authenticated());

    이 코드의 {mpt.version}이 문제였다. 이번 프로젝트부터 버전정보를 yml에 넣고 관리하고 싶어서 버전 관련 부분들을 yml에서 처리하기 시작했는데 컨트롤러에서는 저런식으로 url에 그대로 넣어도 적용되서 필터에도 넣어 봤으나 다음과 같은 3가지 에러가 생겼다.

    2024-01-10T22:56:13.036+09:00 ERROR 7244 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
    org.springframework.web.util.pattern.PatternParseException: Char '.' is not allowed in a captured variable name
    2024-01-10T22:56:13.036+09:00 ERROR 7244 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
    2024-01-10T22:56:13.042+09:00 ERROR 7244 --- [nio-8080-exec-3] o.a.c.c.C.[Tomcat].[localhost]           : Exception Processing ErrorPage[errorCode=0, location=/error]

    원인을 찾아봐도 잘 나오지 않았고 한참을 하나씩 지웠다가 실행해가며 찾았는데 필터에서는 yml 정보를 바로 못 얻어오는 것 같다. 그래서 VersionConfig에 @Value 값을 가지는 필드를 만들고 주입받아서 해결한 방법과 같이 넣어 주었더니 해결되었다.

    2. UserDetails 설정 문제

    지금까지 프로젝트를 하면서 authorizationFilter만 만들고 authenticationFilter는 안 만들어 왔어서 UserDetails가 어떤 메서드를 가지고 있는지 알지 못했다. 하지만 UserDetails를 상속 받은 UserDetailsImpl의 간단한 get메소드만 변경하고 나머지는 false 상태로 두었던게 문제였다.
    디버깅을 통해 계정이 잠겨있다는 예외 문구가 뜨고 검색을 통해 해결할 수 있었다. 따로 서비스 단이나 필터단에서도 토큰에 대한 검증 로직 구현이 가능하지만 UserDetails에서도 토큰 검증이 가능하다는 것을 알았다

profile
개발

0개의 댓글