본문 바로가기
Projects/청하-청년을 위한 커뮤니티 서비스

[청하] 22. Android 강제 업데이트 검사 기능 - JWT 인증 필터에서 제외

by Lpromotion 2024. 10. 16.

“Android 강제 업데이트 검사”는 사용자의 앱 버전이 최소 강제 업데이트 버전을 만족하는지 확인하고, 필요한 경우 업데이트를 유도하는 기능이다.

이 작업은 사용자가 로그인하지 않은 상태에서도 수행되어야 하는 작업이기 때문에 JWT 인증 필터에서 차단된다면 이 작업을 수행할 수 없게 된다.

그래서 Spring Security 설정과 JWT 인증 필터를 수정해 해당 경로가 차단되지 않도록 수정했다.

 

1. 프로젝트 구조

src/main/java/com/example/withpeace/
│
├── config/                  # 설정 관련 클래스
│   └── SecurityConfig.java  # Spring Security 설정
│
├── constant/
│   └── Constant.java        # 상수 정의
│
└── security/
    └── JwtAuthenticationFilter.java  # JWT 인증 필터

 

2. Spring Security 설정 파일 구현

SecurityConfig

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {
    // ... (기존 설정 생략)
    
    @Bean
    protected SecurityFilterChain securityFilterChain(final HttpSecurity httpSecurity) throws Exception {
        return httpSecurity
                // ... (기존 설정 생략)
                .authorizeHttpRequests(requestMatcherRegistry -> requestMatcherRegistry
                        // ... (다른 경로 생략)
                        .requestMatchers("/api/v1/app/check/android").permitAll()
                        .anyRequest().authenticated())

                // ... (기존 설정 생략)
    }
}
.requestMatchers("/api/v1/app/check/android").permitAll()

"/api/v1/app/check/android" 경로에 대한 모든 요청을 사용자의 인증 상태나 역할에 상관없이 허용한다.

 

3. 상수 정의

Constant

public class Constant {
    // ... (다른 상수들)
    
    public static final List<String> NO_NEED_AUTH_URLS = List.of(
            // ... (다른 URL들)
            "/api/v1/app/check/android", // 강제 업데이트 검사 URL 추가
    );
}

Constant 클래스에서 인증이 필요없는 URL 목록을 정의한다.

`NO_NEED_AUTH_URLS` 리스트에 강제 업데이트 검사 URL을 추가했다. 이 경로에 대한 요청은 JWT 인증 필터를 거치지 않는다.

 

4. JWT 인증 필터 설정

JwtAuthenticationFilter

@AllArgsConstructor
@Slf4j
public class JwtAuthenticationFilter extends OncePerRequestFilter {
    private final JwtUtil jwtUtil;
    private final JwtAuthenticationProvider jwtAuthenticationProvider;

    // ... (기존 코드 생략)

    @Override
    protected boolean shouldNotFilter(HttpServletRequest request) {
        if(!request.getRequestURI().startsWith("/actuator/prometheus")) {
            log.info(request.getRequestURI());
            log.info(String.valueOf(Constant.NO_NEED_AUTH_URLS.contains(request.getRequestURI())));
        }
        return Constant.NO_NEED_AUTH_URLS.contains(request.getRequestURI())
                || request.getRequestURI().startsWith("/guest");
    }

}

JwtAuthenticationFilter 필터는 JWT 토큰을 검증하고 인증을 처리하는 커스텀 필터이다.

 

shouldNotFilter 메서드

NO_NEED_AUTH_URLS 에 포함된 URL에 대해 JWT 토큰 검증 과정을 수행하지 않는다.

 

5. 전체 동작 과정

  1. 요청이 들어오면 Spring Security 의 기본 필터 체인을 거친다.
  2. SecurityConfig의 `requestMatchers().permitAll()` 설정으로 인해 해당 URL은 인증 없이 통과된다.
  3. 요청이 JwtAuthenticationFilter에 도달하면 `shouldNotFilter` 메서드에 의해 이 필터도 적용되지 않는다.

 

`requestMatchers().permitAll()` 설정이 좀 더 광범위한 설정이고, Spring Security의 모든 보안 검사를 패스하게 된다. (전체 보안 컨텍스트에서 작동)

`NO_NEED_AUTH_URLS`와 `shouldNotFilter` 메서드는 JWT 인증에서만 패스한다.

반응형

댓글