반응형
로그인 경로와 같이 인증이 필요 없는 경로는 별도로 설정해줘야 합니다. 이를 위해 특정 경로를 제외하거나, 인증이 필요 없는 경로를 명시적으로 설정하는 방법을 사용할 수 있습니다.
1. 인증이 필요 없는 경로 설정
application.yml 파일에서 로그인 경로와 같이 인증이 필요 없는 경로를 별도로 설정합니다.
yaml
spring:
cloud:
gateway:
routes:
- id: login_route
uri: http://example-service
predicates:
- Path=/login # 로그인 경로는 인증 필터를 거치지 않음
- id: example_route
uri: http://example-service
predicates:
- Path=/example/**
filters:
- JwtAuthenticationFilter # /example/** 경로에 대해서만 필터 적용
2. 필터 내에서 경로 제외 설정
필터 내에서 특정 경로를 제외하는 로직을 추가할 수도 있습니다. JwtAuthenticationFilter에서 로그인 경로를 제외하도록 설정합니다.
java
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
String path = request.getURI().getPath();
// 로그인 경로는 필터를 통과시키지 않음
if (path.equals("/login")) {
return chain.filter(exchange);
}
// Authorization 헤더가 없는 경우 에러 반환
if (!request.getHeaders().containsKey(HttpHeaders.AUTHORIZATION)) {
return this.onError(exchange, "No authorization header", HttpStatus.UNAUTHORIZED);
}
// Authorization 헤더에서 토큰 추출
String authorizationHeader = request.getHeaders().getOrEmpty(HttpHeaders.AUTHORIZATION).get(0);
String token = authorizationHeader.replace("Bearer ", "");
// WebClient를 사용하여 인증 서버에 토큰 검증 요청
return webClientBuilder.build()
.post()
.uri("http://localhost:8080/auth/validateToken") // 인증 서버의 토큰 검증 엔드포인트
.header(HttpHeaders.AUTHORIZATION, authorizationHeader)
.retrieve()
.onStatus(HttpStatus::is4xxClientError, clientResponse -> Mono.error(new RuntimeException("Invalid Token")))
.onStatus(HttpStatus::is5xxServerError, clientResponse -> Mono.error(new RuntimeException("Server Error")))
.bodyToMono(Void.class) // 응답 본문을 무시하고, 성공 여부만 확인
.then(chain.filter(exchange)); // 인증 성공 시 요청 계속 처리
};
}
3. 다중 필터 경로 설정
다양한 경로에 대해 필터를 다르게 적용할 수도 있습니다. 예를 들어, 인증이 필요한 경로와 그렇지 않은 경로를 구분하여 각각의 라우트에 필터를 적용합니다.
yaml
spring:
cloud:
gateway:
routes:
- id: login_route
uri: http://example-service
predicates:
- Path=/login # 로그인 경로는 인증 필터를 거치지 않음
- id: example_route
uri: http://example-service
predicates:
- Path=/example/**
filters:
- JwtAuthenticationFilter # /example/** 경로에 대해서만 필터 적용
- id: public_route
uri: http://example-service
predicates:
- Path=/public/** # 공개 경로는 인증 필터를 거치지 않음
요약
로그인 경로와 같이 인증이 필요 없는 경로는 별도로 설정해주거나, 필터 내에서 특정 경로를 제외하는 로직을 추가하여 문제를 해결할 수 있습니다. 이를 통해 /example/** 경로에 대해서는 JWT 인증을 적용하면서도, 로그인 경로는 인증을 요구하지 않도록 설정할 수 있습니다.