사용자 도구

사이트 도구


java:zuul

Zuul - API Gateway

Netflix의 Client Serving Server

  • Web Browser 혹은 App 등이 접속하는 서버를 API Gateway 로 만들면 안된다.
  • Client Server Adapter Code Server 를 두고 거기서 Client 에게 필요한 정보를 backend service 에 비동기/non-blocking-io 로 요청을 해서 모으고, 그 결과중 필요한 것만 필터링 해서 넘겨줘야 한다.
  • API Gateway 는 이 때 Client Server Adapter 보다 더 앞에서 Client 의 요청을 받아서 처리한다.
  • Netflix 는 Client 의 종류가 TV, PC, Android, iOS 등 너무 다양해서 API Gateway 를 통해서 요청을 받지만 현재 일반적인 서비스는 그런식으로 만드는 경우가 거의 없어서 실질적으로 API Gateway는 필요가 없다
  • API Gateway 가 필요하다면 무조근 API Gateway 에 접속하는 사용자와 그 backend API의 사용자의 인증체계가 동일해야 한다. 그렇지 않으면 권한 필터링을 잘못하면 backend API의 중요 정보가 비록 로그인 사용자에게라도 다 노출되게 된다. /orders/<userId> 는 로그인을 했을 경우라도, 로그인 사용자가 아닌 다른 사용자 ID로 API 요청을 할 수 있기 때문이다.
  • Client Adapter Code 에서는 /orders API Endpoint만 노출하고 로그인 세션에서 ID값을 읽고 이를 다시 backend에 /orders/<userId>로 넘겨주는 방식을 취해야 한다.
  • FAQ : 인증/권한이 문제라면, backend API가 권한을 처리하면 되는거 아닌가?
    • 아니다, backend API는 자기 본분에 충실해야 한다.
    • 또한, 인증 체계는 하나의 시스템에 2~3개씩 존재할 수 있다.(일반 사용자, admin, 제 3의 상품 제공업체 등)
    • 이 모든 인증 체계에 대해 모든 backend API가 인증/권한을 관리하는 것은 회사 전체의 개발 속도를 떨어뜨린다.
    • 또한 신규 인증 체계 추가시에도 모든 backend API가 이에 대한 처리를 추가해야 한다.
    • 인증 체계 별로 Client Adapter 를 따로 만들고 거기서 일관되게 인증/권한을 처리하는게 개발 속도를 높이고 보안을 높이는 길이다.

Spring Cloud Neflix Zuul

다중 path 지정

zuul:
  routes:
    myserver_mypath:
      path: /mypath/**
      url: ....
      serviceId: myserver
    myserver_another_path:
      path: /anotherpath/**
      url: ...
      serviceId: myserver

actuator

  • /actuator/routes
  • boot 2.1 의 경우 management.endpoints.web.exposure.include=routes 처럼 지정해 줘야 활성화 됨. 혹은 *

Filter

Service ID 알아내기

* 'org.springframework.cloud.netflix.zuul.filters.support.FilterConstants#SERVICE_ID_KEY'' 사용

  @Override
  public boolean shouldFilter() {
    RequestContext context = RequestContext.getCurrentContext();
    return "member-api".equals(context.get(SERVICE_ID_KEY));
  }

참고

java/zuul.txt · 마지막으로 수정됨: 2021/11/09 11:25 저자 kwon37xi