카테고리 없음

api gateway 사용시 로그인 url 처리

jw-backend 2024. 7. 1. 19:05
반응형

로그인 경로와 같이 인증이 필요 없는 경로는 별도로 설정해줘야 합니다. 이를 위해 특정 경로를 제외하거나, 인증이 필요 없는 경로를 명시적으로 설정하는 방법을 사용할 수 있습니다.

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 인증을 적용하면서도, 로그인 경로는 인증을 요구하지 않도록 설정할 수 있습니다.