4장. APIcast 정책

APIcast 정책은 APIcast의 작동 방식을 수정하는 기능 단위입니다. APIcast를 수정하는 방법을 제어하도록 정책을 활성화, 비활성화 및 구성할 수 있습니다. 정책을 사용하여 기본 APIcast 배포에서 사용할 수 없는 기능을 추가합니다. 고유한 정책을 만들거나 Red Hat 3scale이 제공하는 표준 정책을 사용할 수 있습니다.

다음 주제에서는 표준 APIcast 정책, 자체 사용자 지정 APIcast 정책 생성 및 정책 체인에 대한 정보를 제공합니다.

정책 체인을 사용한 서비스의 제어 정책. 정책 체인은 다음을 수행합니다.

  • APIcast에서 사용하는 정책 지정
  • 정책 3scale 용도에 대한 구성 정보 제공
  • 3scale 로드 정책의 순서 지정
참고

Red Hat 3scale은 사용자 지정 정책을 추가하는 방법을 제공하지만 사용자 지정 정책을 지원하지 않습니다.

사용자 지정 정책을 사용하여 APIcast 동작을 수정하려면 다음을 수행해야 합니다.

  • APIcast에 사용자 정의 정책 추가
  • APIcast 정책을 구성하는 정책 체인 정의
  • APIcast에 정책 체인 추가

4.1. APIcast 표준 정책

3scale은 다음과 같은 표준 정책을 제공합니다.

3scale에서 표준 정책을 활성화하고 구성할 수 있습니다.

4.1.1. 3scale 인증 캐싱

3scale Auth 캐싱 정책은 APIcast에 대한 인증 호출을 캐시합니다. 운영 모드를 선택하여 캐시 작업을 구성할 수 있습니다.

3scale 인증 캐싱은 다음 모드에서 사용할 수 있습니다.

1. Strict - 인증된 호출만 캐시합니다.

"제한" 모드는 인증된 호출만 캐시합니다. 정책이 "strict" 모드에서 실행 중이고 호출이 실패하거나 거부된 경우 정책은 캐시 항목을 무효화합니다. 백엔드에 연결할 수 없는 경우 캐시된 상태에 관계없이 캐시된 모든 호출이 거부됩니다.

2. 복구 - 백엔드가 다운되면 마지막 요청에 따라 인증합니다.

"Resilient" 모드는 승인 및 거부된 호출을 모두 캐시합니다. 정책이 "resilient" 모드에서 실행 중인 경우 실패한 호출이 기존 캐시 항목을 무효화하지 않습니다. 백엔드에 연결할 수 없는 경우 캐시 상태에 따라 캐시가 계속 인증되거나 거부됩니다.

3. allow - 백엔드가 다운되면 앞과 거부되지 않은 경우 모든 것을 허용합니다.

"Allow" 모드는 승인 및 거부된 호출을 모두 캐시합니다. 정책이 "허용" 모드에서 실행 중인 경우 캐시된 호출은 캐시된 상태에 따라 계속 거부되거나 허용됩니다. 그러나 새 호출은 권한이 부여된 대로 캐시됩니다.

중요

"허용" 모드에서 작동하면 보안에 영향을 미칩니다. 이러한 함축 모드를 고려하고 "허용" 모드를 사용할 때 주의하십시오.

4. none - 캐싱 비활성화.

"없음" 모드는 캐싱을 비활성화합니다. 이 모드는 정책이 활성 상태로 유지되지만 캐싱을 사용하지 않으려는 경우에 유용합니다.

구성 속성

속성description필수 여부

caching_type

caching_type 속성을 사용하면 캐시가 작동할 모드를 정의할 수 있습니다.

데이터 유형: 열거된 문자열 [resilient, strict, allow, none]

제공됨

정책 오브젝트 예

{
  "name": "caching",
  "version": "builtin",
  "configuration": {
    "caching_type": "allow"
  }
}

정책을 구성하는 방법에 대한 자세한 내용은 문서의 정책 체인 만들기 섹션을 참조하십시오.

4.1.2. 3scale Batcher

3scale Batcher 정책은 APIcast가 수신하는 각 API 요청에 대해 3scale 백엔드(Service Management API)를 호출하는 표준 APIcast 권한 부여 메커니즘의 대안을 제공합니다.

3scale Batcher 정책은 권한 부여 상태를 캐시하고 사용 보고서를 일괄 처리하므로 3scale 백엔드에 대한 요청 수를 크게 줄입니다. 3scale Batcher 정책을 사용하면 대기 시간을 줄이고 처리량을 늘려 APIcast 성능을 향상시킬 수 있습니다.

3scale Batcher 정책이 활성화되면 APIcast는 다음과 같은 권한 부여 흐름을 사용합니다.

  1. 각 요청에서 정책은 인증 정보가 캐시되었는지 확인합니다.

    • 자격 증명이 캐시되면 정책은 3scale 백엔드를 호출하는 대신 캐시된 권한 부여 상태를 사용합니다.
    • 자격 증명이 캐시되지 않은 경우 정책은 백엔드를 호출하고 구성 가능한 TTL(Time to Live)으로 권한 부여 상태를 캐시합니다.
  2. 3scale 백엔드에 대한 요청에 해당하는 사용량을 보고하는 대신 정책은 사용량 카운터를 누적하여 배치의 백엔드에 보고합니다. 별도의 스레드는 누적된 사용량 카운터를 단일 호출로 3scale 백엔드에 구성 가능한 빈도와 함께 보고합니다.

3scale Batcher 정책은 처리량을 개선하지만 정확성이 감소합니다. 사용 제한과 현재 사용률은 3scale에 저장되며 APIcast는 3scale 백엔드를 호출할 때만 올바른 권한 부여 상태를 얻을 수 있습니다. 3scale Batcher 정책이 활성화되면 APIcast가 3scale에 호출을 전송하지 않는 기간이 있습니다. 이 기간 동안 호출을 수행하는 애플리케이션이 정의된 한도를 초과할 수 있습니다.

처리량이 속도 제한의 정확도보다 중요한 경우 높은 로드 API에 이 정책을 사용합니다. 3scale Batcher 정책은 보고 빈도 및 권한 부여 TTL이 속도 제한 기간보다 훨씬 적을 때 정확도 측면에서 더 나은 결과를 제공합니다. 예를 들어 제한이 일당이고 보고 빈도 및 권한 부여 TTL이 몇 분으로 구성된 경우.

3scale Batcher 정책은 다음 구성 설정을 지원합니다.

  • auths_ttl: 권한 부여 캐시가 만료될 때 TTL을 초 단위로 설정합니다.

    • 현재 호출에 대한 권한이 캐시되면 APIcast에서 캐시된 값을 사용합니다. auths_ttl 매개 변수에 설정된 시간이 지나면 APIcast는 캐시를 제거하고 3scale 백엔드를 호출하여 권한 부여 상태를 검색합니다.
    • auths_ttl 매개 변수를 0 이외의 값으로 설정합니다. auths_ttl0 값으로 설정하면 요청이 처음 캐시될 때 권한 부여 카운터가 업데이트되어 속도 제한이 적용되지 않습니다.
  • batch_report_seconds: 3scale 백엔드로 보내는 배치 보고서의 빈도를 설정합니다. 기본값은 10 초입니다.
중요

이 정책을 사용하려면 정책 체인에서 3scale APIcast3scale Batcher 정책을 모두 활성화합니다.

4.1.3. 3scale Referrer

3scale Referrer 정책은 Referrer 필터링 기능을 활성화합니다. 서비스 정책 체인에서 정책이 활성화되면 APIcast는 3scale Referrer 정책의 값을 서비스 관리 API 에 상위 AuthRep 호출로 보냅니다. 3scale Referrer 정책의 값은 호출에서 referrer 매개변수로 전송됩니다.

Referrer Filtering 이 작동하는 방법에 대한 자세한 내용은 인증 패턴Referrer Filtering 섹션을 참조하십시오.

4.1.4. 익명 액세스

익명 액세스 정책은 인증 없이 서비스를 노출합니다. 예를 들어 인증 매개 변수를 보내도록 조정할 수 없는 레거시 애플리케이션에 유용할 수 있습니다. 익명 정책은 API Key 및 App Id / App Key 인증 옵션을 사용하는 서비스만 지원합니다. 정책이 제공된 자격 증명이 없는 API 요청에 대해 활성화되면 APIcast는 정책에 구성된 기본 자격 증명을 사용하여 호출을 인증합니다. API 호출을 인증하려면 구성된 자격 증명이 있는 애플리케이션이 존재하고 활성화되어야 합니다.

애플리케이션 계획을 사용하여 기본 자격 증명에 사용되는 애플리케이션에 대한 속도 제한을 구성할 수 있습니다.

참고

정책 체인에서 이 두 정책을 함께 사용하는 경우 APIcast 정책에 익명 액세스 정책을 배치해야 합니다.

다음은 정책에 필요한 구성 속성입니다.

  • auth_type: 아래 대안 중 하나에서 값을 선택하고 속성이 API에 구성된 인증 옵션에 해당하는지 확인합니다.

    • app_id_and_app_key: App ID / App Key 인증 옵션의 경우.
    • user_key: API 키 인증 옵션의 경우.
  • app_id (app _id_and_app_key 인증 유형 전용): API 호출과 함께 인증 정보가 제공되지 않은 경우 권한 부여에 사용되는 애플리케이션의 앱 ID입니다.
  • app_key (app _id_and_app_key 인증 유형 전용): 인증 정보가 API 호출과 함께 제공되지 않는 경우 권한 부여에 사용되는 애플리케이션의 앱 키입니다.
  • user_key (사용자 키 auth_ type 전용): 인증 정보가 API 호출과 함께 제공되지 않는 경우 권한 부여에 사용되는 애플리케이션의 API 키입니다.

그림 4.1. 익명 액세스 정책

익명 액세스 정책

4.1.5. Camel 서비스

Camel 서비스 정책을 사용하여 정의된 Apache Camel 프록시를 통해 3scale 트래픽을 전송하는 HTTP 프록시를 정의할 수 있습니다. 이 경우 Camel은 APIcast에서 트래픽을 Camel로 전송한 다음 Camel에서 의 트래픽을 API 백엔드로 보내는 역방향 HTTP 프록시로 작동합니다.

다음 예제에서는 트래픽 흐름을 보여줍니다.

Camel 서비스 정책 요청 flow

3scale 백엔드로 전송된 모든 APIcast 트래픽에서는 Camel 프록시를 사용하지 않습니다. 이 정책은 Camel 프록시 및 API 백엔드 간 통신에만 적용됩니다.

모든 트래픽을 프록시를 통해 보내려면 HTTP_PROXY 환경 변수를 사용해야 합니다.

참고
  • Camel 서비스 정책은 모든 로드 밸런싱 정책을 비활성화하고 트래픽이 Camel 프록시로 전송됩니다.
  • HTTP_PROXY,HTTPS_PROXY 또는 ALL_PROXY 매개 변수가 정의된 경우 이 정책은 이러한 값을 덮어씁니다.
  • 프록시 연결이 인증을 지원하지 않습니다. 인증을 위해 헤더 수정 정책을 사용합니다.

4.1.5.1. 설정

다음 예는 정책 체인 구성을 보여줍니다.

"policy_chain": [
    {
      "name": "apicast.policy.apicast"
    },
    {
      "name": "apicast.policy.camel",
      "configuration": {
          "all_proxy": "http://192.168.15.103:8080/",
          "http_proxy": "http://192.168.15.103:8080/",
          "https_proxy": "http://192.168.15.103:8443/"
      }
    }
]

http _proxy 또는 https_proxy 가 정의되지 않은 경우 all _proxy 값이 사용됩니다.

4.1.5.1.1. 사용 사례 예

Camel 서비스 정책은 Apache Camel을 사용하여 3scale에서 보다 세부적인 정책과 변환을 적용하도록 설계되었습니다. 이 정책은 HTTP 및 HTTPS를 통한 Apache Camel과의 통합을 지원합니다. 자세한 내용은 6장. Fuse의 정책 확장을 사용하여 3scale 메시지 컨텐츠 변환 의 내용을 참조하십시오.

일반 HTTP 프록시 정책 사용에 대한 자세한 내용은 4.1.20절. “프록시 서비스” 을 참조하십시오.

프로젝트 예

GitHub의 Camel 프록시 정책에서 사용할 수 있는 camel-netty-proxy 예제를 참조하십시오. 이 예제 프로젝트는 API 백엔드에서 대문자로 응답 본문을 변환하는 HTTP 프록시를 보여줍니다.

4.1.6. 조건부 정책

조건 정책은 정책 체인을 포함하므로 다른 APIcast 정책과 다릅니다. 각 nginx 단계에서 평가되는 조건(예: 액세스,재작성,로그 등)을 정의합니다. 조건이 true이면 조건 정책은 체인에 포함된 각 정책에 대해 해당 단계를 실행합니다.

중요

APIcast 조건 정책은 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다. Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.

다음 예제에서는 Conditional Policy에서 다음 조건을 정의한다고 가정합니다. request 메서드는 POST입니다.

APIcast --> Caching --> Conditional --> Upstream

                             |
                             v

                          Headers

                             |
                             v

                       URL Rewriting

이 경우 요청이 POST 인 경우 각 단계에 대한 실행 순서는 다음과 같습니다.

  1. APIcast
  2. 캐싱
  3. 헤더
  4. URL 다시 작성
  5. 업스트림

요청이 POST 가 아닌 경우 각 단계에 대한 실행 순서는 다음과 같습니다.

  1. APIcast
  2. 캐싱
  3. 업스트림

4.1.6.1. 조건

조건 정책 체인에서 정책을 실행할지 여부를 결정하는 조건은 JSON 을 사용하여 표현할 수 있으며 유동 템플릿을 사용합니다.

이 예제에서는 요청 경로가 /example_path:

{
  "left": "{{ uri }}",
  "left_type": "liquid",
  "op": "==",
  "right": "/example_path",
  "right_type": "plain"
}

왼쪽 및 오른쪽 피연산자는 모두 유동 또는 일반 문자열로 평가할 수 있습니다. 일반 문자열이 기본값입니다.

작업을 또는 와 결합할 수 있습니다. 이 구성은 이전 예와 백엔드 헤더의 값과 동일하게 확인합니다.

{
  "operations": [
    {
      "left": "{{ uri }}",
      "left_type": "liquid",
      "op": "==",
      "right": "/example_path",
      "right_type": "plain"
    },
    {
      "left": "{{ headers['Backend'] }}",
      "left_type": "liquid",
      "op": "==",
      "right": "test_upstream",
      "right_type": "plain"
    }
  ],
  "combine_op": "and"
}

자세한 내용은 정책 구성 스키마 를 참조하십시오.

4.1.6.1.1. 유동 변수에서 지원되는 변수
  • uri
  • 호스트
  • remote_addr
  • 헤더['Some-Header']

업데이트된 변수 목록은 다음과 같습니다. ngx_variable.lua

이 예제에서는 요청의 백엔드 헤더가 스테이징 될 때 업스트림 정책을 실행합니다.

{
   "name":"conditional",
   "version":"builtin",
   "configuration":{
      "condition":{
         "operations":[
            {
               "left":"{{ headers['Backend'] }}",
               "left_type":"liquid",
               "op":"==",
               "right":"staging"
            }
         ]
      },
      "policy_chain":[
         {
            "name":"upstream",
            "version": "builtin",
            "configuration":{
               "rules":[
                  {
                     "regex":"/",
                     "url":"http://my_staging_environment"
                  }
               ]
            }
         }
      ]
   }
}

4.1.7. 컨텐츠 캐싱

콘텐츠 캐싱 정책을 사용하면 사용자 지정 조건에 따라 캐싱을 활성화 및 비활성화할 수 있습니다. 이러한 조건은 클라이언트 요청에만 적용할 수 있습니다. 여기서 업스트림 응답은 정책에서 사용할 수 없습니다.

cache-control 헤더가 전송되면 APIcast에서 설정한 시간 초과보다 우선 순위가 사용됩니다.

다음 예제 구성은 Method가 GET인 경우 응답을 캐시합니다.

설정 예

{
  "name": "apicast.policy.content_caching",
  "version": "builtin",
  "configuration": {
    "rules": [
      {
        "cache": true,
        "header": "X-Cache-Status-POLICY",
        "condition": {
          "combine_op": "and",
          "operations": [
            {
              "left": "{{method}}",
              "left_type": "liquid",
              "op": "==",
              "right": "GET"
            }
          ]
        }
      }
    ]
  }
}

4.1.7.1. 지원되는 구성

  • 다음 방법에 대해 Content Caching 정책을 비활성화하도록 설정합니다. POST,PUT 또는 DELETE.
  • 하나의 규칙이 일치하고 캐시를 활성화하면 실행이 중지되고 비활성화되지 않습니다. 여기서는 우선 순위별 정렬이 중요합니다.

4.1.7.2. 업스트림 응답 헤더

NGINX proxy_cache_valid 지시문 정보는 APICAST_CACHE_ STATUS_CODES 및 APICAST_CACHE_ MAX_TIME 을 사용하여 전역적으로 설정할 수 있습니다. 업스트림에 시간 초과와 관련된 다른 동작이 필요한 경우 Cache-Control 헤더를 사용합니다.

4.1.8. CORS 요청 처리

CORS(Cross Origin Resource Sharing) 요청 처리 정책을 사용하면 다음을 지정할 수 있어 CORS 동작을 제어할 수 있습니다.

  • 허용된 헤더
  • 허용된 메서드
  • 허용되는 인증 정보
  • 허용되는 원본 헤더

CORS 요청 처리 정책은 지정되지 않은 모든 CORS 요청을 차단합니다.

참고

정책 체인에서 이 두 정책을 함께 사용하는 경우 APIcast 정책 앞에 CORS 요청 처리 정책을 배치해야 합니다.

구성 속성

속성description필수 여부

allow_headers

allow_headers 속성은 APIcast에서 허용할 CORS 헤더를 지정할 수 있는 배열입니다.

데이터 유형: 문자열 배열은 CORS 헤더여야 합니다.

아니요

allow_methods

allow_methods 속성은 APIcast에서 허용할 CORS 메서드를 지정할 수 있는 배열입니다.

데이터 유형: 열거된 문자열 배열 [GET, HEAD, POST, PUT, DELETE, PATCH, OPTIONS, TRACE, CONNECT]

아니요

allow_origin

allow_origin 속성을 사용하면 원본 도메인 APIcast에서 허용하는 것을 지정할 수 있습니다.

데이터 유형: 문자열

아니요

allow_credentials

allow_credentials 속성을 사용하면 APIcast에서 인증 정보를 사용하여 CORS 요청을 허용할지 여부를 지정할 수 있습니다.

데이터 유형: 부울

아니요

정책 오브젝트 예

{
  "name": "cors",
  "version": "builtin",
  "configuration": {
    "allow_headers": [
      "App-Id", "App-Key",
      "Content-Type", "Accept"
    ],
    "allow_credentials": true,
    "allow_methods": [
      "GET", "POST"
    ],
    "allow_origin": "https://example.com"
  }
}

정책을 구성하는 방법에 대한 자세한 내용은 문서의 3scale 섹션의 정책 체인 만들기 섹션을 참조하십시오.

4.1.9. 사용자 정의 지표

사용자 지정 지표 정책은 업스트림 API에서 보낸 응답 후에 지표를 추가하는 가용성을 추가합니다. 이 정책의 주요 사용 사례는 응답 코드 상태, 헤더 또는 다른 NGINX 변수에 따라 지표를 추가하는 것입니다.

4.1.9.1. 사용자 정의 메트릭의 제한 사항

  • 요청이 업스트림 API로 전송되기 전에 인증이 수행되면 새 지표를 업스트림 API에 보고하기 위해 백엔드에 대한 두 번째 호출이 수행됩니다.
  • 이 정책은 배치 정책에서는 작동하지 않습니다.
  • 정책이 지표 값을 내보내기 전에 지표 포털에서 지표를 생성해야 합니다.

4.1.9.2. 요청 흐름 예

다음 차트는 인증이 캐시되지 않은 경우의 요청 흐름 및 인증이 캐시될 때의 흐름도 보여줍니다.

4.1.9.3. 구성 예

이 정책은 업스트림 API에서 400 상태를 반환하는 경우 헤더 증가로 메트릭 오류를 늘립니다.

{
  "name": "apicast.policy.custom_metrics",
  "configuration": {
    "rules": [
      {
        "metric": "error",
        "increment": "{{ resp.headers['increment'] }}",
        "condition": {
          "operations": [
            {
              "right": "{{status}}",
              "right_type": "liquid",
              "left": "400",
              "op": "=="
            }
          ],
          "combine_op": "and"
        }
      }
    ]
  }
}

이 정책은 업스트림 API에서 200 상태를 반환하는 경우 status_code 정보를 사용하여 hits 메트릭을 늘립니다.

{
  "name": "apicast.policy.custom_metrics",
  "configuration": {
    "rules": [
      {
        "metric": "hits_{{status}}",
        "increment": "1",
        "condition": {
          "operations": [
            {
              "right": "{{status}}",
              "right_type": "liquid",
              "left": "200",
              "op": "=="
            }
          ],
          "combine_op": "and"
        }
      }
    ]
  }
}

4.1.10. 에코

Echo 정책은 선택적 HTTP 상태 코드와 함께 들어오는 요청을 클라이언트에 다시 출력합니다.

구성 속성

속성description필수 여부

status

Echo 정책이 클라이언트로 반환되는 HTTP 상태 코드

데이터 유형: 정수

아니요

종료

Echo 정책에서 사용할 종료 모드를 지정합니다. 요청 종료 모드에서는 들어오는 요청이 처리되지 않도록 중지합니다. set exit 모드는 재작성 단계를 건너뜁니다.

data type: enumerated string [request, set]

제공됨

정책 오브젝트 예

{
  "name": "echo",
  "version": "builtin",
  "configuration": {
    "status": 404,
    "exit": "request"
  }
}

정책을 구성하는 방법에 대한 자세한 내용은 문서의 3scale 섹션의 정책 체인 만들기 섹션을 참조하십시오.

4.1.11. 에지 제한

에지 제한 정책은 백엔드 API로 전송된 트래픽의 유연한 속도 제한을 제공하는 것을 목표로 하며 기본 3scale 권한 부여와 함께 사용할 수 있습니다. 정책에서 지원하는 사용 사례의 몇 가지 예는 다음과 같습니다.

  • 최종 사용자 속도 제한: 요청의 인증 헤더에 전달된 JWT 토큰의 하위 (주체) 클레임 값에 따른 제한 비율입니다. 이는 {{ jwt.sub }} 로 구성됩니다.
  • RPS(초당 요청) 속도 제한.
  • 서비스당 글로벌 요금 제한: 애플리케이션당이 아닌 서비스당 제한을 적용합니다.
  • 동시 연결 제한: 허용된 동시 연결 수를 설정합니다.

4.1.11.1. 제한 유형

정책은 lua-resty-limit-traffic 라이브러리에서 제공하는 다음 유형의 제한을 지원합니다.

  • leaky_bucket_limiters: 평균 요청 수와 최대 버스트 크기를 기반으로 하는 누수된 버킷 알고리즘을 기반으로 합니다.
  • fixed_window_limiters: 고정된 시간에 따라(지난 n초).
  • connection_limiters: 동시 연결 수에 따라.

서비스 또는 전역적으로 제한 범위를 지정할 수 있습니다.

4.1.11.2. 제한 정의

제한에는 IP 주소, 서비스, 엔드포인트, 식별자, 특정 헤더의 값 및 기타 엔터티와 같이 제한을 정의하는 데 사용되는 엔터티를 인코딩하는 키가 있습니다. 이 키는 limiter의 key 매개변수에 지정됩니다.

key 는 다음 속성으로 정의된 오브젝트입니다.

  • name: 키 이름을 정의합니다. 범위 내에서 고유해야 합니다.
  • scope: 키의 범위를 정의합니다. 지원되는 범위는 다음과 같습니다.

    • 하나의 서비스(서비스)에 영향을 주는 서비스 범위당.
    • 모든 서비스(글로벌)에 영향을 주는글로벌범위.
  • name_type: name 값이 평가되는 방법을 정의합니다.

    • 일반 텍스트 (일반)
    • 기타 (유사)

각 제한에는 유형에 따라 몇 가지 매개변수도 있습니다.

  • leaky_bucket_limiters: rate, burst.

    • rate: 지연 없이 초당 수행할 수 있는 요청 수를 정의합니다.
    • burst: 허용되는 속도를 초과할 수 있는 초당 요청 양을 정의합니다. 속도에 따라 허용된 비율보다 높은 요청에 대해 인위적인 지연이 도입됩니다 . 버스트 에 정의된 것보다 초당 더 많은 요청으로 속도를 초과하면 요청이 거부됩니다.
  • fixed_window_limiters:count,windows. count창에 정의된 초당 수행할 수 있는 요청 수를 정의합니다 .
  • connection_limiters:conn,burst,delay.

    • Conn: 허용되는 최대 동시 연결 수를 정의합니다. 초당 버스트 커넥션 수를 초과할 수 있습니다.
    • 지연: 제한을 초과하는 연결을 지연할 시간(초)을 정의합니다.

  • service_A에 대한 분당 10개의 요청을 허용합니다.

    {
      "key": { "name": "service_A" },
      "count": 10,
      "window": 60
    }
  • 버스트가 10개인 100개 연결을 허용하고 1초가 지연됩니다.

    {
      "key": { "name": "service_A" },
      "conn": 100,
      "burst": 10,
      "delay": 1
    }

각 서비스에 대해 여러 제한을 정의할 수 있습니다. 여러 제한이 정의되는 경우 한 개 이상의 제한에 도달하면 요청이 거부되거나 지연될 수 있습니다.

4.1.11.3. 유동 템플릿

에지 제한 정책을 사용하면 키에 있는 변수를 지원하여 동적 키에 대한 제한을 지정할 수 있습니다. 이를 위해 키의 name_type 매개 변수를ude로 설정해야 하며 name 매개 변수에서 변수를 사용할 수 있습니다. 예를 들어, {{ remote_addr }} (클라이언트 IP 주소의 경우 {{ jwt.sub }} ) 또는 JWT 토큰의 하위 클레임의 경우 {{ jwt.sub }}입니다.

예제

{
  "key": { "name": "{{ jwt.sub }}", "name_type": "liquid" },
  "count": 10,
  "window": 60
}

ms 지원에 대한 자세한 내용은 5.1절. “정책에서 변수 및 필터 사용” 의 내용을 참조하십시오.

4.1.11.4. 조건 적용

각 제한 프로그램에는 제한이 적용되는 시기를 정의하는 조건이 있어야 합니다. 조건은 제한자의 condition 속성에 지정됩니다.

조건은 다음 속성에 의해 정의됩니다.

  • combine_op: 작업 목록에 적용되는 부울 연산자입니다. 또는 의 값이 지원됩니다.
  • 운영: 평가해야 하는 조건 목록입니다. 각 작업은 다음 속성을 사용하여 오브젝트로 표시됩니다.

    • left: 작업의 왼쪽 부분입니다.
    • left_type: 왼쪽 속성을 평가하는 방법(정상 또는 유동).
    • right: 작업의 오른쪽 부분.
    • right_type: 올바른 속성 평가 방법(일반 또는 유동).
    • op: Operator가 왼쪽과 오른쪽 부분 사이에 적용됩니다. 다음은 == (equals) 및 != (동일하지 않음)의 두 가지 값이 지원됩니다.

예제

"condition": {
  "combine_op": "and",
  "operations": [
    {
      "op": "==",
      "right": "GET",
      "left_type": "liquid",
      "left": "{{ http_method }}",
      "right_type": "plain"
    }
  ]
}

4.1.11.5. 속도 제한 카운터의 스토리지 구성

기본적으로 에지 제한 정책은 속도 제한 카운터에 OpenResty 공유 사전을 사용합니다. 그러나 공유 사전 대신 외부 Redis 서버를 사용할 수 있습니다. 이 기능은 여러 APIcast 인스턴스가 배포될 때 유용할 수 있습니다. redis_url 매개 변수를 사용하여 Redis 서버를 구성할 수 있습니다.

4.1.11.6. 오류 처리

제한자는 오류를 처리하는 방법을 구성하기 위해 다음 매개변수를 지원합니다.

  • limits_exceeded_error: 구성된 제한이 초과될 때 클라이언트로 반환되는 오류 상태 코드 및 메시지를 지정합니다. 다음 매개변수를 구성해야 합니다.

    • status_code: 제한을 초과할 때 요청의 상태 코드입니다. 기본값: 429.
    • error_handling: 다음 옵션을 사용하여 오류를 처리하는 방법을 지정합니다.

      • exit: 요청 처리를 중지하고 오류 메시지를 반환합니다.
      • log: 처리 요청을 완료하고 출력 로그를 반환합니다.
  • configuration_error: 잘못된 구성이 있는 경우 클라이언트에 반환되는 오류 상태 코드 및 메시지를 지정합니다. 다음 매개변수를 구성해야 합니다.

    • status_code : 구성 문제가 있는 경우 상태 코드입니다. 기본값: 500.
    • error_handling: 다음 옵션을 사용하여 오류를 처리하는 방법을 지정합니다.

      • exit: 요청 처리를 중지하고 오류 메시지를 반환합니다.
      • log: 처리 요청을 완료하고 출력 로그를 반환합니다.

4.1.12. 헤더 수정

헤더 수정 정책을 사용하면 기존 헤더를 수정하거나 수신 요청 또는 응답에서 추가 헤더를 추가하거나 제거할 수 있습니다. 응답 헤더와 요청 헤더를 모두 수정할 수 있습니다.

Header 수정 정책은 다음 구성 매개변수를 지원합니다.

  • 요청: 요청 헤더에 적용할 작업 목록
  • response: 응답 헤더에 적용할 작업 목록

각 작업은 다음 매개변수로 구성됩니다.

  • op: 적용할 작업을 지정합니다. add 작업은 기존 헤더에 값을 추가합니다. set 작업은 헤더와 값을 생성하고, 이미 존재하는 경우 기존 헤더의 값을 덮어씁니다. push 작업은 헤더와 값을 생성하지만 기존 헤더의 값이 이미 있는 경우 덮어쓰지 않습니다. 대신, push 는 기존 헤더에 값을 추가합니다. 삭제 작업은 헤더를 제거합니다.
  • 헤더: 만들 헤더를 지정하거나 수정할 헤더를 지정하고 헤더 이름(예: Custom-Header)으로 사용할 수 있는 모든 문자열이 될 수 있습니다.
  • value_type: 헤더 값을 평가하는 방법을 정의합니다. 일반 텍스트의 경우 일반 텍스트 또는 유동 템플릿으로 사용할 수 있습니다. 자세한 내용은 5.1절. “정책에서 변수 및 필터 사용”의 내용을 참조하십시오.
  • : 헤더에 사용할 값을 지정합니다. 값 유형의 "liquid"의 경우 값은 {{ variable_from_context }} 형식이어야 합니다. 삭제할 때는 필요하지 않습니다.

정책 오브젝트 예

{
  "name": "headers",
  "version": "builtin",
  "configuration": {
    "response": [
      {
        "op": "add",
        "header": "Custom-Header",
        "value_type": "plain",
        "value": "any-value"
      }
    ],
    "request": [
      {
        "op": "set",
        "header": "Authorization",
        "value_type": "plain",
        "value": "Basic dXNlcm5hbWU6cGFzc3dvcmQ="
      },
      {
        "op": "set",
        "header": "Service-ID",
        "value_type": "liquid",
        "value": "{{service.id}}"
      }
    ]
  }
}

정책을 구성하는 방법에 대한 자세한 내용은 문서의 3scale 섹션의 정책 체인 만들기 섹션을 참조하십시오.

4.1.13. IP 확인

IP 확인 정책은 IP 목록에 따라 요청을 거부하거나 허용하는 데 사용됩니다.

구성 속성

속성description데이터 유형필수 여부

check_type

check_type 속성에는 허용 목록 또는 블랙리스트 라는 두 개의 가능한 값이 있습니다.블랙리스트 는 목록의 IP에서 모든 요청을 거부합니다. 허용 목록은 목록에 없는 IP의 모든 요청을 거부합니다.

문자열은 허용 목록 또는 차단목록이어야 합니다

제공됨

ips

ips 속성을 사용하면 허용 목록 또는 차단 목록에 IP 주소 목록을 지정할 수 있습니다. 단일 IP 및 CIDR 범위를 모두 사용할 수 있습니다.

문자열 배열은 유효한 IP 주소여야 합니다

제공됨

error_msg

error_msg 속성을 사용하면 요청이 거부될 때 반환된 오류 메시지를 구성할 수 있습니다.

string

아니요

client_ip_sources

client_ip_sources 속성을 사용하면 클라이언트 IP를 검색하는 방법을 구성할 수 있습니다. 기본적으로 마지막 호출자 IP가 사용됩니다. 다른 옵션은 X-Forwarded-ForX-Real-IP 입니다.

문자열 배열, 유효한 옵션은 X-Forwarded-For,X- Real-IP,last_caller 중 하나 이상입니다.

아니요

정책 오브젝트 예

{
  "name": "ip_check",
  "configuration": {
    "ips": [ "3.4.5.6", "1.2.3.0/4" ],
    "check_type": "blacklist",
    "client_ip_sources": ["X-Forwarded-For", "X-Real-IP", "last_caller"],
    "error_msg": "A custom error message"
  }
}

정책을 구성하는 방법에 대한 자세한 내용은 문서의 3scale 섹션의 정책 체인 만들기 섹션을 참조하십시오.

4.1.14. JWT 청구 확인

JWT(JSON 웹 토큰) 클레임에 따라 JWT Claim Check 정책을 사용하면 리소스 대상 및 메서드를 차단하는 새 규칙을 정의할 수 있습니다.

4.1.14.1. JWT 청구 확인 정책 정보

JWT 클레임의 값을 기반으로 라우팅하려면 JWT를 검증하고 정책이 공유하는 컨텍스트에 클레임을 저장하는 체인에 정책이 필요합니다.

JWT Claim Check 정책이 리소스와 방법을 차단하는 경우 정책은 JWT 작업도 검증합니다. 또는 메서드 리소스가 일치하지 않는 경우 요청은 백엔드 API로 계속됩니다.

예제: GET 요청의 경우 요청이 거부되지 않는 경우 JWT에 역할 클레임이 admin으로 있어야 합니다. 반면 GET 이외의 요청은 JWT 작업을 검증하지 않으므로 JWT 제약 조건 없이 POST 리소스가 허용됩니다.

{
  "name": "apicast.policy.jwt_claim_check",
  "configuration": {
      "error_message": "Invalid JWT check",
      "rules": [
          {
              "operations": [
                  {"op": "==", "jwt_claim": "role", "jwt_claim_type": "plain", "value": "admin"}
              ],
              "combine_op":"and",
              "methods": ["GET"],
              "resource": "/resource",
              "resource_type": "plain"
          }
      ]
  }
}

4.1.14.2. 정책 체인에서 JWT 클레임 검사 정책 구성

정책 체인에서 JWT Claim Check 정책을 구성하려면 다음을 수행합니다.

사전 요구 사항

  • 3scale 설치에 액세스할 수 있어야 합니다.
  • 모든 배포가 완료될 때까지 기다려야 합니다.
4.1.14.2.1. 정책 구성
  1. API에 JWT Claim Check 정책을 추가하려면 표준 정책 활성화 에 설명된 단계를 따르고 JWT Claim Check를 선택합니다.
  2. JWT Claim Check 링크를 클릭합니다.
  3. 정책을 활성화하려면 Enabled (활성화) 확인란을 선택합니다.
  4. 규칙을 추가하려면 더하기 아이콘을 클릭합니다.
  5. resource_type 을 지정합니다.
  6. 운영자를 선택합니다.
  7. 규칙에서 제어하는 리소스를 나타냅니다.
  8. 허용되는 메서드를 추가하려면 더하기 아이콘을 클릭합니다.
  9. 트래픽이 차단될 때 사용자에게 표시하려면 오류 메시지를 입력합니다.
  10. JWT Claim Check를 사용하여 API 설정을 마치면 Update Policy(정책 업데이트 )를 클릭합니다.

    • 해당 섹션에서 더하기 + 아이콘을 클릭하여 더 많은 리소스 유형과 허용되는 방법을 추가할 수 있습니다.
  11. Update Policy(정책 체인 업데이트)를 클릭하여 변경 사항을 저장합니다.

4.1.15. 유동 컨텍스트 디버그

참고

Context Debug 정책은 개발 환경에서 디버깅 용도로만 사용되며 프로덕션 환경에서는 그렇지 않습니다.

이 정책은 컨텍스트에서 사용할 수 있는 오브젝트와 값을 포함하는 JSON 을 사용하여 API 요청에 응답하며, 플레이버 템플릿을 평가하는 데 사용할 수 있습니다. 3scale APIcast 또는 업스트림 정책과 결합되는 경우 올바르게 작동하려면 정책 체인에 Context Debug를 배치해야 합니다. 이 정책은 원형 참조를 방지하기 위해 중복된 오브젝트만 한 번만 포함하고 스텁 값으로 교체합니다.

정책이 활성화될 때 APIcast에서 반환하는 값의 예는 다음과 같습니다.

    {
      "jwt": {
        "azp": "972f7b4f",
        "iat": 1537538097,
        ...
        "exp": 1537574096,
        "typ": "Bearer"
      },
      "credentials": {
        "app_id": "972f7b4f"
      },
      "usage": {
        "deltas": {
          "hits": 1
        },
        "metrics": [
          "hits"
        ]
      },
      "service": {
        "id": "2",
        ...
      }
      ...
    }

4.1.16. 로깅

로깅 정책에는 다음 두 가지 용도가 있습니다.

  • 액세스 로그 출력을 활성화 및 비활성화하려면 다음을 수행합니다.
  • 각 서비스에 대한 사용자 정의 액세스 로그 형식을 만들고 사용자 정의 액세스 로그를 작성하는 조건을 설정할 수 있습니다.

로깅 정책을 액세스 로그 위치에 대한 글로벌 설정과 결합할 수 있습니다. APICAST_ACCESS_LOG_FILE 환경 변수를 설정하여 APIcast 액세스 로그의 위치를 구성합니다. 기본적으로 이 변수는 표준 출력 장치인 /dev/stdout 으로 설정됩니다. 글로벌 APIcast 매개변수에 대한 자세한 내용은 ??? 의 내용을 참조하십시오.

또한 로깅 정책에는 다음 기능이 있습니다.

  • 이 정책은 enable_access_logs 구성 매개 변수만 지원합니다.
  • 액세스 로그를 활성화하려면 enable_access_logs 매개변수를 선택하거나 로깅 정책을 비활성화합니다.
  • API의 액세스 로깅을 비활성화하려면 다음을 수행합니다.

    1. 정책을 활성화합니다.
    2. enable_access_logs 매개변수를 지웁니다.
    3. Submit(제출) 버튼을 클릭합니다.
  • 기본적으로 이 정책은 정책 체인에서 활성화되지 않습니다.

4.1.16.1. 모든 API에 대한 글로벌 구성

로깅 옵션은 API에서 올바르게 포맷되지 않은 로그 문제를 방지하는 데 도움이 됩니다. 사용자 지정 APIcast 환경 변수를 설정하고 모든 API에서 로깅 정책을 구현합니다. 다음은 모든 서비스에 로드된 정책의 예입니다. custom_env.lua

local cjson = require('cjson')
local PolicyChain = require('apicast.policy_chain')
local policy_chain = context.policy_chain

local logging_policy_config = cjson.decode([[
{
  "enable_access_logs": false,
  "custom_logging": "\"{{request}}\" to service {{service.id}} and {{service.name}}"
}
]])

policy_chain:insert( PolicyChain.load_policy('logging', 'builtin', logging_policy_config), 1)

return {
  policy_chain = policy_chain,
  port = { metrics = 9421 },
}

이 특정 환경에서 APIcast를 실행하려면 다음을 수행합니다.

docker run --name apicast --rm -p 8080:8080 \
    -v $(pwd):/config \
    -e APICAST_ENVIRONMENT=/config/custom_env.lua \
    -e THREESCALE_PORTAL_ENDPOINT=https://ACCESS_TOKEN@ADMIN_PORTAL_DOMAIN \
    quay.io/3scale/apicast:master

다음은 고려해야 할 Docker 명령의 주요 개념입니다.

  • 현재 Lua 파일은 컨테이너 -v $(pwd):/config 와 공유해야 합니다.
  • APICAST_ENVIRONMENT 변수는 /config 디렉터리에 저장된 Lua 파일로 설정해야 합니다.

4.1.16.2. 예

이 섹션에서는 로깅 정책 작업 시 몇 가지 예를 설명합니다. 다음 예제에서는 다음 주의 사항을 고려합니다.

  • custom_logging 또는 enable_json_logs 속성이 활성화된 경우 기본 액세스 로그가 비활성화됩니다.
  • enable_json_logs 가 활성화된 경우 custom_logging 필드가 생략됩니다.

액세스 로그 비활성화

{
  "name": "apicast.policy.logging",
  "configuration": {
    "enable_access_logs": false
  }
}

사용자 정의 액세스 로그 활성화

{
  "name": "apicast.policy.logging",
  "configuration": {
    "enable_access_logs": false,
    "custom_logging": "[{{time_local}}] {{host}}:{{server_port}} {{remote_addr}}:{{remote_port}} \"{{request}}\" {{status}} {{body_bytes_sent}} ({{request_time}}) {{post_action_impact}}",
  }
}

서비스 식별자를 사용하여 사용자 정의 액세스 로그 활성화

{
  "name": "apicast.policy.logging",
  "configuration": {
    "enable_access_logs": false,
    "custom_logging": "\"{{request}}\" to service {{service.id}} and {{service.name}}",
  }
}

JSON 형식으로 액세스 로그 구성

{
  "name": "apicast.policy.logging",
  "configuration": {
    "enable_access_logs": false,
    "enable_json_logs": true,
    "json_object_config": [
      {
        "key": "host",
        "value": "{{host}}",
        "value_type": "liquid"
      },
      {
        "key": "time",
        "value": "{{time_local}}",
        "value_type": "liquid"
      },
      {
        "key": "custom",
        "value": "custom_method",
        "value_type": "plain"
      }
    ]
  }
}

성공적인 요청에 대해서만 사용자 정의 액세스 로그 구성

{
  "name": "apicast.policy.logging",
  "configuration": {
    "enable_access_logs": false,
    "custom_logging": "\"{{request}}\" to service {{service.id}} and {{service.name}}",
    "condition": {
      "operations": [
        {"op": "==", "match": "{{status}}", "match_type": "liquid", "value": "200"}
      ],
      "combine_op": "and"
    }
  }
}

응답 상태가 200 또는 500과 일치하는 액세스 로그 사용자 정의

{
  "name": "apicast.policy.logging",
  "configuration": {
    "enable_access_logs": false,
    "custom_logging": "\"{{request}}\" to service {{service.id}} and {{service.name}}",
    "condition": {
      "operations": [
        {"op": "==", "match": "{{status}}", "match_type": "liquid", "value": "200"},
        {"op": "==", "match": "{{status}}", "match_type": "liquid", "value": "500"}
      ],
      "combine_op": "or"
    }
  }
}

4.1.16.3. 사용자 정의 로깅에 대한 추가 정보

사용자 정의 로깅의 경우 내보낸 변수와 함께 템플릿을 사용할 수 있습니다. 이러한 변수는 다음과 같습니다.

  • NGINX 기본 지시문 변수: log_format. 예: {{remote_addr}}.
  • 응답 및 요청 헤더:

    • {{req.headers.FOO}}: 요청에서 FOO 헤더를 가져오려면 다음을 수행합니다.
    • {{Res.headers.FOO}}: 응답에서 FOO 헤더를 검색하려면 다음을 수행합니다.
  • {{service.id}} 와 같은 서비스 정보와 이러한 매개변수에서 제공하는 모든 서비스 속성:

    • THREESCALE_CONFIG_FILE
    • THREESCALE_PORTAL_ENDPOINT

4.1.17. 유지 관리 모드

유지 관리 모드 정책을 사용하면 지정된 상태 코드 및 메시지가 있는 들어오는 요청을 거부할 수 있습니다. 유지 관리 기간 또는 API를 일시적으로 차단하는 데 유용합니다.

구성 속성

다음은 가능한 속성 및 기본값 목록입니다.

속성valuedefaultdescription

status

정수, 선택 사항

503

응답 코드

message

문자열, 선택 사항

503 서비스 사용 불가 - 유지 관리

응답 메시지

유지 관리 모드 정책 예

{
  "policy_chain": [
    {"name": "maintenance-mode", "version": "1.0.0",
    "configuration": {"message": "Be back soon..", "status": 503} },
  ]
}

정책을 구성하는 방법에 대한 자세한 내용은 문서의 3scale 섹션의 정책 체인 만들기 섹션을 참조하십시오.

4.1.18. OAuth 2.0 상호 TLS 클라이언트 인증

이 정책은 모든 API 호출에 대해 OAuth 2.0 상호 TLS 클라이언트 인증을 실행합니다.

OAuth 2.0 상호 TLS 클라이언트 인증 정책 JSON 의 예는 다음과 같습니다.

{
  "$schema": "http://apicast.io/policy-v1/schema#manifest#",
  "name": "OAuth 2.0 Mutual TLS Client Authentication",
  "summary": "Configure OAuth 2.0 Mutual TLS Client Authentication.",
  "description": ["This policy executes OAuth 2.0 Mutual TLS Client Authentication ",
    "(https://tools.ietf.org/html/draft-ietf-oauth-mtls-12) for every API call."
  ],
  "version": "builtin",
  "configuration": {
    "type": "object",
    "properties": { }
  }
}

4.1.19. OAuth 2.0 토큰 세부 검사

OAuth 2.0 토큰 세부 검사 정책을 사용하면 토큰 발행자(Red Hat Single Sign-On)의 토큰 인트로스펙션 엔드포인트(OpenID Connect) 인증 옵션이 있는 서비스에 사용되는 JSON 웹 토큰(JWT) 토큰의 유효성을 검증할 수 있습니다.

APIcast는 auth_type 필드에서 다음 인증 유형을 지원하여 이 끝점을 호출할 때 토큰 인트로스펙션 엔드 포인트 및 인증 정보 APIcast가 사용하는 인증 유형을 결정합니다.

  • use_3scale_oidc_issuer_endpoint: APIcast는 Service Integration 페이지에 구성된 OIDC Issuer 설정의 클라이언트 자격 증명, 클라이언트 ID 및 클라이언트 비밀 과 토큰 인트로스펙션 엔드포인트를 사용합니다. APIcast는 token_introspection_endpoint 필드에서 토큰 인트로스펙션 끝점을 검색합니다. 이 필드는 OIDC 발행자가 반환하는 .well-known/openid-configuration 엔드포인트에 있습니다.

예 4.1. use_3scale_oidc_issuer_endpoint로 설정된 인증 유형

"policy_chain": [
…​
  {
    "name": "apicast.policy.token_introspection",
    "configuration": {
      "auth_type": "use_3scale_oidc_issuer_endpoint"
    }
  }
…​
],
  • client_id+client_secret: 이 옵션을 사용하면 다른 토큰 인트로스펙션 엔드 포인트와 클라이언트 ID 및 클라이언트 시크릿 APIcast를 사용하여 토큰 정보를 요청할 수 있습니다. 이 옵션을 사용하는 경우 다음 구성 매개 변수를 설정합니다.

    • client_id: 토큰 인트로스펙션 엔드 포인트의 클라이언트 ID를 설정합니다.
    • client_secret: 토큰 인트로스펙션 엔드 포인트에 대한 클라이언트 시크릿 설정.
    • introspection_url: 인트로스펙션 엔드 포인트 URL을 설정합니다.

예 4.2. 인증 유형이 client_id+client_secret으로 설정

"policy_chain": [
…​
  {
    "name": "apicast.policy.token_introspection",
    "configuration": {
      "auth_type": "client_id+client_secret",
      "client_id": "myclient",
      "client_secret": "mysecret",
      "introspection_url": "http://red_hat_single_sign-on/token/introspection"
    }
  }
…​
],

auth_type 필드의 설정에 관계없이 APIcast는 Basic Authentication을 사용하여 Token Introspection 호출 (Authorization)을 인증합니다. 기본 <token> 헤더. 여기서 <token> 은 Base64 인코딩 <client_id>:<client_secret> 설정입니다.

OAuth 2.0 토큰 세부 검사 구성

토큰 인트로스펙션 엔드 포인트의 응답에는 활성 특성이 포함되어 있습니다. APIcast는 이 속성의 값을 확인합니다. 특성 값에 따라 APIcast는 호출을 인증하거나 거부합니다.

  • true: 호출 권한이 있음
  • false: Authentication Failed 오류와 함께 호출이 거부됩니다.

이 정책을 사용하면 동일한 JWT 토큰을 호출할 때마다 토큰 인트로스펙션 엔드 포인트를 호출하지 않도록 토큰 캐싱을 활성화할 수 있습니다. 토큰 인트로스펙션 정책에 대한 토큰 캐싱을 활성화하려면 max_cached_tokens 필드를 0 의 값으로 설정하여 기능을 비활성화하고 10000 을 비활성화합니다. 또한 max_ttl_tokens 필드에서 토큰의 TTL(Time to Live) 값을 1 에서 3600 초로 설정할 수 있습니다.

4.1.20. 프록시 서비스

프록시 서비스 정책을 사용하여 정의된 프록시를 사용하여 3scale 트래픽이 전송되는 일반 HTTP 프록시를 정의할 수 있습니다. 이 경우 프록시 서비스는 APIcast에서 트래픽을 HTTP 프록시로 전송한 다음 프록시에서 트래픽을 API 백엔드로 보내는 역방향 HTTP 프록시로 작동합니다.

다음 예제에서는 트래픽 흐름을 보여줍니다.

프록시 서비스 정책 요청 흐름

3scale 백엔드로 전송된 모든 APIcast 트래픽은 프록시를 사용하지 않습니다. 이 정책은 APIcast와 API 백엔드 간의 통신 및 프록시에만 적용됩니다.

모든 트래픽을 프록시를 통해 보내려면 HTTP_PROXY 환경 변수를 사용해야 합니다.

참고
  • 프록시 서비스 정책은 모든 로드 밸런싱 정책을 비활성화하고 트래픽이 프록시로 전송됩니다.
  • HTTP_PROXY,HTTPS_PROXY 또는 ALL_PROXY 매개 변수가 정의된 경우 이 정책은 이러한 값을 덮어씁니다.
  • 프록시 연결이 인증을 지원하지 않습니다. 인증을 위해 헤더 수정 정책을 사용합니다.

4.1.20.1. 설정

다음 예는 정책 체인 구성을 보여줍니다.

"policy_chain": [
    {
      "name": "apicast.policy.apicast"
    },
    {
      "name": "apicast.policy.http_proxy",
      "configuration": {
          "all_proxy": "http://192.168.15.103:8888/",
          "https_proxy": "https://192.168.15.103:8888/",
          "http_proxy": "https://192.168.15.103:8888/"
      }
    }
]

http _proxy 또는 https_proxy 가 정의되지 않은 경우 all _proxy 값이 사용됩니다.

4.1.20.1.1. 사용 사례 예

Proxy 서비스 정책은 HTTP를 통한 Apache Camel을 사용하여 3scale에서 보다 세부적인 정책과 변환을 적용하도록 설계되었습니다. 그러나 프록시 서비스 정책을 일반 HTTP 프록시 서비스로 사용할 수도 있습니다. HTTPS를 통한 Apache Camel과의 통합은 4.1.5절. “Camel 서비스” 의 내용을 참조하십시오.

프로젝트 예

GitHub의 camel-netty-proxy 예제를 참조하십시오. 이 프로젝트에는 API 백엔드에서 대문자로 응답 본문을 변환하는 HTTP 프록시가 표시됩니다.

4.1.21. 제한 헤더 속도

Rate Limit Headers 정책은 애플리케이션이 속도 제한을 가진 애플리케이션 계획에 서브스크립션할 때 응답 메시지에 RateLimit 헤더를 추가합니다. 이러한 헤더는 현재 시간 창에 구성된 요청 할당량 제한과 나머지 요청 할당량 및 초에 대한 유용한 정보를 제공합니다.

제품의 정책 체인에서 Rate Limit Headers 정책을 추가하는 경우 3scale APIcast 정책 앞에 있어야 합니다. 3scale APIcast 정책이 Rate Limit Headers(요금 제한 헤더) 정책 앞에 있는 경우 Rate Limit Headers(요금 제한 헤더) 정책이 작동하지 않습니다.

4.1.21.1. RateLimit 헤더

다음 RateLimit 헤더는 각 메시지에 추가됩니다.

  • RateLimit-Limit: 구성된 시간 창에 총 요청 할당량을 표시합니다(예: 10 개 요청).
  • RateLimit-Remaining: 현재 시간 창에 나머지 요청 할당량을 표시합니다(예: 5 개 요청).
  • RateLimit-Reset: 현재 시간 창에 남은 초(예: 30 초)를 표시합니다. 이 헤더의 동작은 Retry-After 헤더의 delta-초 표기법과 호환됩니다.

기본적으로 Rate Limit Headers 정책이 구성되지 않거나 애플리케이션 계획에 속도 제한이 없는 경우 응답 메시지에는 속도 제한 헤더가 없습니다.

참고

속도 제한 없이 상위 지표에 제한이 구성된 API 지표를 요청하는 경우 상위 제한이 적용되므로 속도 제한 헤더가 여전히 응답에 포함됩니다.

4.1.22. Retry

재시도 정책은 재시도 요청 수를 업스트림 API에 설정합니다. 재시도 정책은 서비스별로 구성되므로 사용자가 원하는 만큼 많은 서비스에 대해 재시도를 활성화하고 다양한 서비스에 대해 서로 다른 재시도 값을 구성할 수 있습니다.

중요

3scale 2.9부터 정책에 재시도할 사례를 구성할 수 없습니다. 이는 모든 서비스에 재시도 요청을 적용하는 환경 변수 APICAST_UPSTREAM_RETRY_CASES 로 제어됩니다. 자세한 내용은 APICAST_UPSTREAM_RETRY_CASES 를 참조하십시오.

재시도 정책 JSON 의 예는 다음과 같습니다.

{
  "$schema": "http://apicast.io/policy-v1/schema#manifest#",
  "name": "Retry",
  "summary": "Allows retry requests to the upstream",
  "description": "Allows retry requests to the upstream",
  "version": "builtin",
  "configuration": {
    "type": "object",
    "properties": {
      "retries": {
        "description": "Number of retries",
        "type": "integer",
        "minimum": 1,
        "maximum": 10
      }
    }
  }
}

4.1.23. RH-SSO/Keycloak 역할 검사

이 정책은 OpenID Connect 인증 옵션과 함께 사용할 때 역할 검사를 추가합니다. 이 정책은 RH-SSO(Red Hat Single Sign-On)에서 발행한 액세스 토큰에서 영역 역할 및 클라이언트 역할을 확인합니다. 영역 역할은 3scale의 모든 클라이언트 리소스에 역할 점검을 추가하려는 경우 지정합니다.

type 속성이 정책 구성에 지정하는 두 가지 유형의 역할 검사가 있습니다.

  • 허용 목록 (기본값): 화이트리스트 를 사용하면 APIcast는 지정된 범위가 JWT 토큰에 있는지 확인하고 JWT에 범위가 없는 경우 호출을 거부합니다.
  • blacklist: 블랙리스트 를 사용하면 JWT 토큰에 블랙리스트로 지정된 범위가 포함된 경우 APIcast에서 호출을 거부합니다.

동일한 정책에서 블랙리스트허용 목록 모두의 검사를 구성할 수는 없지만 RH-SSO/Keycloak 역할 점검 정책의 두 개 이상의 인스턴스를 APIcast 정책 체인에 추가할 수 있습니다.

정책 구성의 scopes 속성을 통해 범위 목록을 구성할 수 있습니다.

범위 오브젝트에는 다음 속성이 있습니다.

  • 리소스: 역할에서 제어하는 리소스(엔드 포인트)입니다. 이 형식은 매핑 규칙과 동일합니다. 패턴은 문자열 시작 부분부터 일치하고 정확히 일치하도록 하려면 끝에 $ 를 추가해야 합니다.
  • resource_type: 리소스 값이 평가되는 방식을 정의합니다.

    • 일반 텍스트 (일반)로: 리소스 값을 일반 텍스트로 평가합니다. 예: /api/v1/products$.
    • 다음과 같이 텍스트 (유사): 리소스 값에서 를 사용할 수 있습니다. 예: /resource_{{ jwt.aud }} 는 클라이언트 ID가 포함된 리소스에 대한 액세스를 관리합니다.
  • 방법: RH-SSO의 사용자 역할에 따라 이 매개변수를 사용하여 APIcast에서 허용되는 HTTP 메서드를 나열합니다. 예를 들어 다음을 포함하는 메서드를 허용할 수 있습니다.

    • /resource 1 에 액세스할 수 있는 role1 영역 역할입니다. 이 영역 역할이 없는 메서드의 경우 블랙리스트 를 지정해야 합니다.
    • /resource 1에 액세스하는 role1 이라는 client 1 역할.
    • /resource 1에 액세스할 수 있는 role1 및 role2 영역 역할입니다. realm_roles 에서 역할을 지정합니다. 각 역할의 범위를 나타낼 수도 있습니다.
    • /resource 1에 액세스할 액세스 토큰의 수신자인 애플리케이션 클라이언트의 role 1 이라는 클라이언트 역할입니다. 유동 클라이언트 유형을 사용하여 클라이언트에 JSON 웹 토큰(JWT) 정보를 지정합니다.
    • /resource1 에 액세스하는 액세스 토큰의 수신자인 애플리케이션 클라이언트의 클라이언트 ID를 포함하는 client 역할. 유동 클라이언트 유형을 사용하여 클라이언트 역할의 이름에 JWT 정보를 지정합니다.
    • 애플리케이션 클라이언트 ID를 포함하여 리소스에 액세스하는 role1 이라는 클라이언트 역할입니다. 유동 클라이언트 유형을 사용하여 리소스에 JWT 정보를 지정합니다 .
  • realm_roles: 이를 사용하여 영역 역할을 확인합니다(Red Hat Single Sign-On 문서의 Realm Roles 참조).

    영역 역할은 Red Hat Single Sign-On에서 발행한 JWT에 있습니다.

      "realm_access": {
        "roles": [
          "<realm_role_A>", "<realm_role_B>"
        ]
      }

    정책에 실제 역할을 지정해야 합니다.

    "realm_roles": [
      { "name": "<realm_role_A>" }, { "name": "<realm_role_B>" }
    ]

    다음은 realm_roles 배열에 있는 각 오브젝트의 사용 가능한 속성입니다.

  • name: 역할의 이름을 지정합니다.
  • name_type: 이름을 평가하는 방법을 정의합니다. 일반 또는 유동일 수 있습니다 ( resource_type과 동일한 방식으로 작동).
  • client_roles: client_roles를 사용하여 클라이언트 네임스페이스에서 특정 액세스 역할을 확인합니다(Red Hat Single Sign-On 문서의 클라이언트 역할 참조).

    클라이언트 역할은 resource_access 클레임 아래에 있는 JWT에 있습니다.

      "resource_access": {
        "<client_A>": {
          "roles": [
            "<client_role_A>", "<client_role_B>"
          ]
        },
        "<client_B>": {
          "roles": [
            "<client_role_A>", "<client_role_B>"
          ]
        }
      }

    정책에 클라이언트 역할을 지정합니다.

    "client_roles": [
      { "name": "<client_role_A>", "client": "<client_A>" },
      { "name": "<client_role_B>", "client": "<client_A>" },
      { "name": "<client_role_A>", "client": "<client_B>" },
      { "name": "<client_role_B>", "client": "<client_B>" }
    ]

    다음은 client_roles 배열에 있는 각 오브젝트의 사용 가능한 속성입니다.

  • name: 역할의 이름을 지정합니다.
  • name_type: name 값을 평가하는 방법을 정의합니다. 일반 또는 유동일 수 있습니다 ( 리소스 유형과 동일한 방식으로 작동).
  • 클라이언트: 역할의 클라이언트를 지정합니다. 정의되지 않은 경우 이 정책은 aud 클레임을 클라이언트로 사용합니다.
  • client_type: 클라이언트 값을 평가하는 방법을 정의합니다. 일반 또는 유동일 수 있습니다 ( resource_type과 동일한 방식으로 작동).

4.1.24. 라우팅

라우팅 정책을 사용하면 요청을 서로 다른 대상 엔드포인트로 라우팅할 수 있습니다. 대상 엔드포인트를 정의한 다음 UI에서 정규 표현식을 사용하여 들어오는 요청을 라우팅할 수 있습니다.

APIcast 정책과 결합하는 경우 먼저 제공되는 두 정책에서 응답에 콘텐츠를 출력하므로 라우팅 정책을 체인에 APIcast에 배치해야 합니다. 두 번째 단계에서 콘텐츠 단계를 실행하도록 변경하면 요청이 이미 클라이언트에 전송되므로 응답에 대한 아무것도 출력하지 않습니다.

4.1.24.1. 라우팅 규칙

  • 여러 규칙이 있는 경우 라우팅 정책이 첫 번째 일치 항목을 적용합니다. 이 규칙을 정렬할 수 있습니다.
  • 일치하는 규칙이 없으면 정책은 업스트림을 변경하지 않으며 서비스 구성에 정의된 정의된 개인 기본 URL을 사용합니다.

4.1.24.2. 요청 경로 규칙

경로가 /accounts 일 때 http://example.com 로 라우팅하는 구성입니다.

 {
    "name": "routing",
    "version": "builtin",
    "configuration": {
      "rules": [
        {
          "url": "http://example.com",
          "condition": {
            "operations": [
              {
                "match": "path",
                "op": "==",
                "value": "/accounts"
              }
            ]
          }
        }
      ]
    }
  }

4.1.24.3. 헤더 규칙

Test-Header 헤더 값이 123 일 때 http://example.com 로 라우팅하는 구성입니다.

 {
    "name": "routing",
    "version": "builtin",
    "configuration": {
      "rules": [
        {
          "url": "http://example.com",
          "condition": {
            "operations": [
              {
                "match": "header",
                "header_name": "Test-Header",
                "op": "==",
                "value": "123"
              }
            ]
          }
        }
      ]
    }
  }

4.1.24.4. 쿼리 인수 규칙

쿼리 인수 test_query_arg 의 값이 123 일 때 http://example.com 로 라우팅하는 구성입니다.

 {
    "name": "routing",
    "version": "builtin",
    "configuration": {
      "rules": [
        {
          "url": "http://example.com",
          "condition": {
            "operations": [
              {
                "match": "query_arg",
                "query_arg_name": "test_query_arg",
                "op": "==",
                "value": "123"
              }
            ]
          }
        }
      ]
    }
  }

4.1.24.5. JWT 클레임 규칙

JWT 클레임의 값을 기반으로 라우팅하려면 JWT를 검증하고 정책이 공유하는 컨텍스트에 저장하는 체인에 정책이 있어야 합니다.

JWT 클레임 test_claim 값이 123 일 때 http://example.com 로 라우팅하는 구성입니다.

 {
    "name": "routing",
    "version": "builtin",
    "configuration": {
      "rules": [
        {
          "url": "http://example.com",
          "condition": {
            "operations": [
              {
                "match": "jwt_claim",
                "jwt_claim_name": "test_claim",
                "op": "==",
                "value": "123"
              }
            ]
          }
        }
      ]
    }
  }

4.1.24.6. 다중 작업 규칙

규칙은 모두 '및' combine_op를 사용하여 또는 하나 이상의 값이 true(또는' combine_op사용)로 평가되는 경우에만 지정된 업스트림에 대한 여러 개의 작업과 경로를 가질 수 있습니다. combine_op 의 기본값은 '및'입니다.

요청 경로가 /accounts 이고 헤더 Test-Header 값이 123 인 경우 http://example.com 로 라우팅하는 구성입니다.

 {
    "name": "routing",
    "version": "builtin",
    "configuration": {
      "rules": [
        {
          "url": "http://example.com",
          "condition": {
            "combine_op": "and",
            "operations": [
              {
                "match": "path",
                "op": "==",
                "value": "/accounts"
              },
              {
                "match": "header",
                "header_name": "Test-Header",
                "op": "==",
                "value": "123"
              }
            ]
          }
        }
      ]
    }
  }

요청 경로가 /accounts 이거나 헤더 Test-Header 값이 123 인 경우 http://example.com 로 라우팅하는 구성입니다.

 {
    "name": "routing",
    "version": "builtin",
    "configuration": {
      "rules": [
        {
          "url": "http://example.com",
          "condition": {
            "combine_op": "or",
            "operations": [
              {
                "match": "path",
                "op": "==",
                "value": "/accounts"
              },
              {
                "match": "header",
                "header_name": "Test-Header",
                "op": "==",
                "value": "123"
              }
            ]
          }
        }
      ]
    }
  }

4.1.24.7. 규칙 결합

룰을 결합할 수 있습니다. 여러 규칙이 있는 경우 선택한 업스트림 규칙은 true로 평가되는 첫 번째 규칙 중 하나입니다.

몇 가지 규칙이 있는 구성입니다.

 {
    "name": "routing",
    "version": "builtin",
    "configuration": {
      "rules": [
        {
          "url": "http://some_upstream.com",
          "condition": {
            "operations": [
              {
                "match": "path",
                "op": "==",
                "value": "/accounts"
              }
            ]
          }
        },
        {
          "url": "http://another_upstream.com",
          "condition": {
            "operations": [
              {
                "match": "path",
                "op": "==",
                "value": "/users"
              }
            ]
          }
        }
      ]
    }
  }

4.1.24.8. catch-all 규칙

작업이 없는 규칙은 항상 일치합니다. 범용 규칙을 정의하는 데 유용할 수 있습니다.

이 구성은 요청을 http://some_upstream.com 로 라우팅하고 경로가 /abc 인 경우 http://another_upstream.com 로 요청을 라우팅하고, 마지막으로 요청을 http://another_upstream.com로 라우팅하고 , 이전 규칙이 true로 평가되지 않은 경우 http://default_upstream.com 로 라우팅합니다.

 {
    "name": "routing",
    "version": "builtin",
    "configuration": {
      "rules": [
        {
          "url": "http://some_upstream.com",
          "condition": {
            "operations": [
              {
                "match": "path",
                "op": "==",
                "value": "/abc"
              }
            ]
          }
        },
        {
          "url": "http://another_upstream.com",
          "condition": {
            "operations": [
              {
                "match": "path",
                "op": "==",
                "value": "/def"
              }
            ]
          }
        },
        {
          "url": "http://default_upstream.com",
          "condition": {
            "operations": []
          }
        }
      ]
    }
  }

4.1.24.9. 지원되는 작업

지원되는 작업은 ==, !=, 일치 항목입니다. 후자는 정규 표현식이 있는 문자열과 일치하며 ngx.re.match를 사용하여 구현됩니다.

이는 != 을 사용하는 구성입니다. 경로가 /accounts 가 아닌 경우 http://example.com 로 라우팅됩니다 :

 {
    "name": "routing",
    "version": "builtin",
    "configuration": {
      "rules": [
        {
          "url": "http://example.com",
          "condition": {
            "operations": [
              {
                "match": "path",
                "op": "!=",
                "value": "/accounts"
              }
            ]
          }
        }
      ]
    }
  }

4.1.24.10. 유동 템플릿

구성 값에 유동 템플릿을 사용할 수 있습니다. 이를 통해 체인에 있는 정책이 컨텍스트에 my_var 키를 저장하는 경우 동적 값으로 규칙을 정의할 수 있습니다.

이 구성은 해당 값을 사용하여 요청을 라우팅하는 구성입니다.

 {
    "name": "routing",
    "version": "builtin",
    "configuration": {
      "rules": [
        {
          "url": "http://example.com",
          "condition": {
            "operations": [
              {
                "match": "header",
                "header_name": "Test-Header",
                "op": "==",
                "value": "{{ my_var }}",
                "value_type": "liquid"
              }
            ]
          }
        }
      ]
    }
  }

4.1.24.11. host _header에서 사용되는 호스트설정

기본적으로 요청이 라우팅되면 정책은 일치하는 규칙의 URL 호스트를 사용하여 Host 헤더를 설정합니다. host _header 특성을 사용하여 다른 호스트 를 지정할 수 있습니다.

이 구성은 some_host.com 을 호스트 헤더의 호스트로 지정하는 구성입니다.

 {
    "name": "routing",
    "version": "builtin",
    "configuration": {
      "rules": [
        {
          "url": "http://example.com",
          "host_header": "some_host.com",
          "condition": {
            "operations": [
              {
                "match": "path",
                "op": "==",
                "value": "/"
              }
            ]
          }
        }
      ]
    }
  }

4.1.25. SOAP

SOAP 정책은 정책에 지정된 매핑 규칙을 사용하여 HTTP 요청의 SOAPAction 또는 Content-Type 헤더에 제공되는 SOAP 작업 URI와 일치합니다.

구성 속성

속성description필수 여부

패턴

pattern 속성을 사용하면 APIcast에서 SOAPAction URI에서 일치 항목을 찾을 문자열을 지정할 수 있습니다.

데이터 유형: 문자열

제공됨

metric_system_name

metric_system_name 속성을 사용하면 일치하는 패턴에서 적중을 등록할 3scale 백엔드 지표를 지정할 수 있습니다.

데이터 유형: 문자열, 유효한 메트릭이어야 합니다

제공됨

정책 오브젝트 예

{
  "name": "soap",
  "version": "builtin",
  "configuration": {
    "mapping_rules": [
      {
        "pattern": "http://example.com/soap#request",
        "metric_system_name": "soap",
        "delta": 1
      }
    ]
  }
}

정책을 구성하는 방법에 대한 자세한 내용은 문서의 3scale 섹션의 정책 체인 만들기 섹션을 참조하십시오.

4.1.26. TLS 클라이언트 인증서 유효성 검사

TLS 클라이언트 인증서 유효성 검사 정책을 사용하여 APIcast는 TLS 핸드셰이크를 구현하고 허용 목록에 대해 클라이언트 인증서의 유효성을 검사합니다. 화이트리스트에는 CA(Certified Authority)에서 서명한 인증서 또는 일반 클라이언트 인증서가 포함되어 있습니다. 만료되었거나 유효하지 않은 인증서의 경우 요청이 거부되고 다른 정책은 처리되지 않습니다.

클라이언트는 APIcast에 연결하여 요청을 보내고 클라이언트 인증서를 제공합니다. APIcast는 정책 구성에 따라 들어오는 요청에 제공된 인증서의 신뢰성을 확인합니다. APIcast는 업스트림에 연결할 때 사용할 고유한 클라이언트 인증서를 사용하도록 구성할 수도 있습니다.

4.1.26.1. TLS 클라이언트 인증서 유효성 검사를 사용하도록 APIcast 설정

TLS를 종료하도록 APIcast를 구성해야 합니다. 아래 단계에 따라 클라이언트 인증서 유효성 검사 정책을 사용하여 APIcast에서 사용자가 제공한 클라이언트 인증서의 유효성 검사를 구성합니다.

사전 요구 사항

  • 3scale 설치에 액세스할 수 있어야 합니다.
  • 모든 배포가 완료될 때까지 기다려야 합니다.
4.1.26.1.1. 정책에서 작동하도록 APIcast 설정

APIcast를 설정하고 TLS를 종료하도록 구성하려면 다음 단계를 따르십시오.

  1. OpenShift 템플릿을 사용하여 APIcast 배포에 표시된 대로 액세스 토큰을 가져오고 APIcast 자체 관리를 배포해야 합니다.

    참고

    전체 게이트웨이에 대한 일부 인증서를 사용하도록 APIcast 인스턴스를 재구성해야 하므로 APIcast 자체 관리 배포가 필요합니다.

  2. 테스트 목적으로만 캐시 및 스테이징 환경 없이 lazy loader 및 --param 플래그를 사용하여 테스트를 간편하게 수행할 수 있습니다.

    oc new-app -f https://raw.githubusercontent.com/3scale/3scale-amp-openshift-templates/master/apicast-gateway/apicast.yml --param CONFIGURATION_LOADER=lazy --param DEPLOYMENT_ENVIRONMENT=staging --param CONFIGURATION_CACHE=0
  3. 테스트 목적으로 인증서를 생성합니다. 또는 프로덕션 배포의 경우 인증 기관에서 제공하는 인증서를 사용할 수 있습니다.
  4. TLS 인증서로 시크릿 생성

    oc create secret tls apicast-tls
    --cert=ca/certs/server.crt
    --key=ca/keys/server.key
  5. APIcast 배포 내부의 시크릿 마운트

    oc set volume dc/apicast --add --name=certificates --mount-path=/var/run/secrets/apicast --secret-name=apicast-tls
  6. HTTPS의 포트 8443에서 수신 대기하도록 APIcast 구성

    oc set env dc/apicast APICAST_HTTPS_PORT=8443 APICAST_HTTPS_CERTIFICATE=/var/run/secrets/apicast/tls.crt APICAST_HTTPS_CERTIFICATE_KEY=/var/run/secrets/apicast/tls.key
  7. 서비스에 8443 노출

    oc patch service apicast -p '{"spec":{"ports":[{"name":"https","port":8443,"protocol":"TCP"}]}}'
  8. 기본 경로 삭제

    oc delete route api-apicast-staging
  9. apicast 서비스를 경로로 노출

    oc create route passthrough --service=apicast --port=https --hostname=api-3scale-apicast-staging.$WILDCARD_DOMAIN
    참고

    이 단계는 사용할 모든 API 및 모든 API의 도메인 변경에 필요합니다.

  10. [your_user_key]를 플레이스 홀더에 지정하여 이전에 배포된 게이트웨이가 작동하고 구성이 저장되었는지 확인합니다.

    curl https://api-3scale-apicast-staging.$WILDCARD_DOMAIN?user_key=[Your_user_key] -v --cacert ca/certs/ca.crt

4.1.26.2. 정책 체인에서 TLS 클라이언트 인증서 유효성 검사 구성

정책 체인에서 TLS 클라이언트 인증서 유효성 검사를 구성하려면 다음을 수행합니다.

사전 요구 사항

4.1.26.2.1. 정책 구성
  1. API에 TLS 클라이언트 인증서 유효성 검사 정책을 추가하려면 표준 정책 활성화 에 설명된 단계를 따르고 TLS 클라이언트 인증서 유효성 검사를 선택합니다.
  2. TLS 클라이언트 인증서 유효성 검사 링크를 클릭합니다.
  3. 정책을 활성화하려면 Enabled (활성화) 확인란을 선택합니다.
  4. 허용 목록에 인증서를 추가하려면 더하기 아이콘을 클릭합니다.
  5. ----- BEGIN CERTIFICATE----- 및 -----END CERTIFICATE----- 를 포함한 인증서를 지정합니다.
  6. TLS 클라이언트 인증서 유효성 검사를 사용하여 API 설정을 마치면 Update Policy(정책 업데이트 )를 클릭합니다.

추가 사항:

  • 더하기 아이콘을 클릭하여 더 많은 인증서를 추가할 수 있습니다.
  • 위쪽 및 아래쪽 화살표를 클릭하여 인증서를 재구성할 수도 있습니다.

변경 사항을 저장하려면 Update Policy(정책 체인 업데이트 )를 클릭합니다.

4.1.26.3. TLS 클라이언트 인증서 유효성 검사 정책의 기능 확인

TLS 클라이언트 인증서 유효성 검사 정책의 기능을 확인하려면 다음을 수행합니다.

사전 요구 사항

4.1.26.3.1. 정책 기능 확인

자리 표시자에 [your_user_key] 를 지정하여 적용된 정책을 확인할 수 있습니다.

curl https://api-3scale-apicast-staging.$WILDCARD_DOMAIN\?user_key\=[Your_user_key] -v --cacert ca/certs/ca.crt --cert ca/certs/client.crt --key ca/keys/client.key

curl https://api-3scale-apicast-staging.$WILDCARD_DOMAIN\?user_key\=[Your_user_key] -v --cacert ca/certs/ca.crt --cert ca/certs/server.crt --key ca/keys/server.key

curl https://api-3scale-apicast-staging.$WILDCARD_DOMAIN\?user_key\=[Your_user_key] -v --cacert ca/certs/ca.crt

4.1.26.4. 화이트리스트에서 인증서 제거

허용 목록에서 인증서를 제거하려면 다음을 수행합니다.

4.1.26.4.1. 인증서 제거
  1. TLS 클라이언트 인증서 유효성 검사 링크를 클릭합니다.
  2. 허용 목록에서 인증서를 제거하려면 x 아이콘을 클릭합니다.
  3. 인증서 제거를 완료하고 나면 Update Policy(정책 업데이트 )를 클릭합니다.

변경 사항을 저장하려면 Update Policy(정책 체인 업데이트 )를 클릭합니다.

4.1.26.5. 참고 자료

인증서 사용에 대한 자세한 내용은 Red Hat Certificate System 을 참조하십시오.

4.1.27. TLS 종료

이 섹션에서는 정책의 개념, 구성, 확인 및 파일 제거와 같은 TLS(Transport Layer Security) 종료 정책에 대한 정보를 제공합니다.

TLS 종료 정책을 사용하면 모든 API에 대해 단일 인증서를 사용하지 않고 각 API에 대한 TLS 요청을 완료하도록 APIcast를 구성할 수 있습니다. APIcast는 클라이언트에 대한 연결을 설정하기 전에 구성 설정을 가져옵니다. 이러한 방식으로 APIcast는 정책의 인증서를 사용하며 TLS를 종료합니다. 이 정책은 다음 소스에서 작동합니다.

  • 정책 구성에 저장됩니다.
  • 파일 시스템에 저장됨.

기본적으로 이 정책은 정책 체인에서 활성화되지 않습니다.

4.1.27.1. 정책 체인에서 TLS 종료 구성

이 섹션에서는 PEM(개인 정보 보호 강화 메일) 형식 인증서를 사용하여 정책 체인에서 TLS 종료를 구성하는 전제 조건 및 단계에 대해 설명합니다.

사전 요구 사항

  • 사용자가 발급한 인증서
  • PEM 형식의 서버 인증서
  • PEM 형식의 인증서 개인 키
4.1.27.1.1. 정책 구성
  1. API에 TLS 종료 정책을 추가하려면 표준 정책 활성화 에 설명된 단계를 따르고 TLS 종료를 선택합니다.
  2. TLS 종료 링크를 클릭합니다.
  3. 정책을 활성화하려면 Enabled (활성화) 확인란을 선택합니다.
  4. 정책에 TLS 인증서를 추가하려면 더하기 아이콘을 클릭합니다.
  5. 인증서 소스를 선택합니다.

    • 포함된 인증서: 서버 인증서의 경로와 인증서 개인 키의 경로를 지정합니다.
    • 로컬 파일 시스템의 인증서: 인증서 개인 키와 서버 인증서를 탐색합니다.
  6. TLS 종료를 사용하여 API 설정을 마치면 Update Policy(정책 업데이트 )를 클릭합니다.

추가 사항:

  • 더하기 아이콘을 클릭하여 더 많은 인증서를 추가할 수 있습니다.
  • 위쪽 및 아래쪽 화살표를 클릭하여 인증서를 재구성할 수도 있습니다.

변경 사항을 저장하려면 Update Policy(정책 체인 업데이트 )를 클릭합니다.

4.1.27.2. TLS 종료 정책의 기능 확인

사전 요구 사항

4.1.27.2.1. 정책 기능 확인

정책이 다음 명령을 사용하여 작동하는 경우 명령줄에서 테스트할 수 있습니다.

curl “${public_URL}:${port}/?user_key=${user_key}" --cacert ${path_to_certificate}/ca.pem -v

다음과 같습니다.

  • PUBLIC_URL= 준비 공개 기본 URL
  • port= 포트 번호
  • user_key= 인증할 사용자 키
  • path_to_certificate= 로컬 파일 시스템의 CA 인증서 경로

4.1.27.3. TLS 종료에서 파일 제거

이 섹션에서는 TLS 종료 정책에서 인증서 및 키 파일을 제거하는 단계를 설명합니다.

사전 요구 사항

4.1.27.3.1. 인증서 제거
  1. TLS 종료 링크를 클릭합니다.
  2. 인증서 및 키를 제거하려면 x 아이콘을 클릭합니다.
  3. 인증서 제거를 완료하고 나면 Update Policy(정책 업데이트 )를 클릭합니다.

변경 사항을 저장하려면 Update Policy(정책 체인 업데이트 )를 클릭합니다.

4.1.28. 업스트림

업스트림 정책을 사용하면 정규 표현식을 사용하여 호스트 요청 헤더를 구문 분석하고 개인 기본 URL에 정의된 업스트림 URL을 다른 URL로 바꿀 수 있습니다.

예를 들면 다음과 같습니다.

regex /foo 가 있는 정책과 URL 필드 newexample.com 은 URL https://www.example.com/foo/123/newexample.com으로 교체합니다.

정책 체인 참조:

속성description필수 여부

REGex

regex 속성을 사용하면 요청 경로와 일치하는 항목을 검색할 때 업스트림 정책에서 사용할 정규식을 지정할 수 있습니다.

data type: string, 유효한 정규식 구문이어야 합니다

제공됨

url

url 속성을 사용하여 일치 시 대체 URL을 지정할 수 있습니다. 업스트림 정책은 이 URL이 유효한지 여부를 확인하지 않습니다.

data type: string, 올바른 URL인지 확인하십시오.

제공됨

정책 오브젝트 예

{
  "name": "upstream",
  "version": "builtin",
  "configuration": {
    "rules": [
      {
        "regex": "^/v1/.*",
        "url": "https://api-v1.example.com",

      }
    ]
  }
}

정책을 구성하는 방법에 대한 자세한 내용은 문서의 3scale 섹션의 정책 체인 만들기 섹션을 참조하십시오.

4.1.29. 업스트림 연결

업스트림 연결 정책을 사용하면 3scale 설치에서 API 백엔드 서버를 구성한 방법에 따라 각 API에 대해 다음 지시문의 기본값을 변경할 수 있습니다.

  • proxy_connect_timeout
  • proxy_send_timeout
  • proxy_read_timeout

4.1.29.1. 정책 체인에서 업스트림 연결 구성

이 섹션에서는 정책 체인에서 업스트림 연결 정책을 구성하는 단계에 대해 설명합니다.

사전 요구 사항

  • 3scale 설치에 액세스할 수 있어야 합니다.
  • 모든 배포가 완료될 때까지 기다려야 합니다.
4.1.29.1.1. 정책 구성
  1. API에 업스트림 연결 정책을 추가하려면 표준 정책 활성화에 설명된 단계를 따르고 업스트림 연결을 선택합니다 .
  2. 업스트림 연결 링크를 클릭합니다.
  3. 정책을 활성화하려면 Enabled (활성화) 확인란을 선택합니다.
  4. 업스트림 연결에 대한 옵션을 구성합니다.

    • send_timeout
    • connect_timeout
    • read_timeout
  5. 업스트림 연결을 사용하여 API 설정을 마치면 Update Policy (업스트림 연결)를 클릭합니다.

변경 사항을 저장하려면 Update Policy(정책 체인 업데이트 )를 클릭합니다.

4.1.30. 업스트림 상호 TLS

업스트림 상호 TLS 정책을 사용하면 구성에 설정된 인증서를 기반으로 APIcast와 업스트림 API 간에 상호 TLS 연결을 설정할 수 있습니다. 이 정책은 다양한 업스트림 API에 대한 여러 인증서를 지원합니다.

4.1.30.1. 정책 체인에서 업스트림 상호 TLS 구성

이 섹션에서는 정책 체인에서 업스트림 상호 TLS 정책을 구성하는 단계를 설명합니다.

사전 요구 사항

  • 3scale 설치에 액세스할 수 있어야 합니다.

절차

  1. API에 업스트림 상호 TLS 정책을 추가하려면 표준 정책 활성화에 설명된 단계를 따르고 Upstream 상호 TLS 를 선택합니다.
  2. Upstream 상호 TLS 링크를 클릭합니다.
  3. 정책을 활성화하려면 Enabled (활성화) 확인란을 선택합니다.
  4. 인증서 유형 선택 :

    • path: OpenShift에서 생성된 것과 같이 인증서의 경로를 지정하려는 경우.
    • embedded: 타사에서 생성된 인증서를 파일 시스템에서 업로드하여 사용하려는 경우.
  5. 인증서 에서 클라이언트 인증서를 지정합니다.
  6. 인증서 키의 키를 지정합니다.
  7. Upstream Mutual TLS를 사용하여 API 설정을 마치면 정책 체인 업데이트를 클릭합니다.

변경 사항을 승격하려면 다음을 수행합니다.

  1. [your_product] 페이지 > 통합 > 구성으로 이동합니다.
  2. APIcast Configuration(APIcast 구성 )에서 Promote v# to Staging APIcast(스테이징 APIcast 로 승격)를 클릭합니다.

    • v# 은 승격할 구성의 버전 번호를 나타냅니다.

4.1.31. URL 다시 작성

URL 재작성 정책을 사용하면 요청 경로 및 쿼리 문자열을 수정할 수 있습니다.

3scale APIcast 정책과 결합하면 정책 체인의 APIcast 정책보다 먼저 URL 재작성 정책을 배치하면 APIcast 매핑 규칙이 수정된 경로에 적용됩니다. 정책 체인에서 APIcast 다음에 URL 재작성 정책을 배치하면 매핑 규칙이 원래 경로에 적용됩니다.

정책은 다음 두 가지 작업 세트를 지원합니다.

  • 명령: 요청 경로를 다시 작성하기 위해 적용할 명령 목록입니다.
  • query_args_commands: 요청의 쿼리 문자열을 다시 작성하기 위해 적용할 명령 목록입니다.

4.1.31.1. 경로를 다시 작성하기 위한 명령

다음은 명령 목록 의 각 명령이 구성된 구성 매개변수입니다.

  • op: 적용할 작업. 사용 가능한 옵션은 subgsub 입니다. 하위 작업은 첫 번째로 일치하는 일치 항목만 지정된 정규식으로 교체합니다. gsub 작업은 모든 일치 발생을 지정된 정규식으로 대체합니다. subgsub 작업에 대한 설명서를 참조하십시오.
  • regex: 일치하는 Perl 호환 정규 표현식.
  • 교체: 일치 시 사용되는 대체 문자열입니다.
  • 옵션 (선택 사항): regex 일치 방식을 정의하는 옵션입니다. 사용 가능한 옵션에 대한 자세한 내용은 OpenResty Lua 모듈 프로젝트 문서의 ngx.re.match 섹션을 참조하십시오.
  • 중단 (선택 사항): true(확인란 활성화)로 설정하면 명령이 URL을 다시 작성하는 경우 마지막으로 적용된 URL이 됩니다(목록의 모든 명령이 폐기됨).

4.1.31.2. 쿼리 문자열을 다시 작성하기 위한 명령

다음은 query_args_commands 목록의 각 명령이 구성된 구성 매개변수입니다.

  • op: 쿼리 인수에 적용할 작업입니다. 다음 옵션을 사용할 수 있습니다.

    • add: 기존 인수에 값을 추가합니다.
    • 설정: 설정되지 않은 경우 arg를 만들고 설정하면 해당 값을 바꿉니다.
    • push: 설정되지 않은 경우 arg를 만들고 설정할 때 값을 추가합니다.
    • 삭제: arg를 삭제합니다.
  • arg: 작업이 적용되는 쿼리 인수 이름입니다.
  • : 쿼리 인수에 사용되는 값을 지정합니다. 값 유형의 "liquid"의 경우 값은 {{ variable_from_context }} 형식이어야 합니다. 삭제 작업의 경우 값이 고려되지 않습니다.
  • value_type (선택 사항): 쿼리 인수 값이 평가되는 방법을 정의합니다. 일반 텍스트의 경우 일반 텍스트 또는 유동 템플릿으로 평가하기 위해 일반 텍스트 또는 유동이 될 수 있습니다. 자세한 내용은 5.1절. “정책에서 변수 및 필터 사용”의 내용을 참조하십시오. 지정하지 않으면 기본적으로 "plain" 유형이 사용됩니다.

예제

URL 재작성 정책은 다음과 같이 구성됩니다.

{
  "name": "url_rewriting",
  "version": "builtin",
  "configuration": {
    "query_args_commands": [
      {
        "op": "add",
        "arg": "addarg",
        "value_type": "plain",
        "value": "addvalue"
      },
      {
        "op": "delete",
        "arg": "user_key",
        "value_type": "plain",
        "value": "any"
      },
      {
        "op": "push",
        "arg": "pusharg",
        "value_type": "plain",
        "value": "pushvalue"
      },
      {
        "op": "set",
        "arg": "setarg",
        "value_type": "plain",
        "value": "setvalue"
      }
    ],
    "commands": [
      {
        "op": "sub",
        "regex": "^/api/v\\d+/",
        "replace": "/internal/",
        "options": "i"
      }
    ]
  }

APIcast로 전송된 원래 요청 URI:

https://api.example.com/api/v1/products/123/details?user_key=abc123secret&pusharg=first&setarg=original

URL 다시 작성을 적용한 후 APIcast가 API 백엔드로 전송하는 URI입니다.

https://api-backend.example.com/internal/products/123/details?pusharg=first&pusharg=pushvalue&setarg=setvalue

다음과 같은 변환이 적용됩니다.

  1. 하위 문자열 /api/v1/ 는 유일한 경로 재작성 명령과 일치하며 /internal/ 로 대체됩니다.
  2. user_key 쿼리 인수가 삭제됩니다.
  3. pushvalue 값은 push arg 쿼리 인수에 추가 값으로 추가됩니다.
  4. 쿼리 인수 setarg원래 값은 구성된 값 setarg로 교체됩니다.
  5. 쿼리 인수 add arg가 원래 URL에 없기 때문에 명령 add 가 적용되지 않았습니다.

정책을 구성하는 방법에 대한 자세한 내용은 문서의 3scale 섹션의 정책 체인 만들기 섹션을 참조하십시오.

4.1.32. 캡처를 사용하여 URL 재작성

캡처 정책으로 URL 다시 작성은 4.1.31절. “URL 다시 작성” 정책에 대한 대안이며 API 백엔드에 전달하기 전에 API 요청의 URL을 다시 작성할 수 있습니다.

captures 정책으로 다시 작성되는 URL은 URL의 인수를 검색하고 다시 작성된 URL에 해당 값을 사용합니다.

정책은 구성 매개 변수를 변환하는 기능을 지원합니다. 요청 URL에 적용되는 변환을 설명하는 개체 목록입니다. 각 tranformation 오브젝트는 두 개의 속성으로 구성됩니다.

  • match_rule: 이 규칙은 들어오는 요청 URL과 일치합니다. 명명된 인수를 {nameOfArgument} 형식으로 포함할 수 있습니다. 이러한 인수는 다시 작성된 URL에서 사용할 수 있습니다. URL은 정규 표현식으로 match_rule 과 비교됩니다. 명명된 인수와 일치하는 값에는 PCRE regex 표기법에서 다음 문자만 포함해야 합니다. [\w-.~%!$&'()*+,;=@:]+. 기타 regex 토큰은 문자열 시작 시 ^ 와 같은 match_rule 표현식에서 사용할 수 있으며 문자열 끝에는 $ 를 사용할 수 있습니다.
  • 템플릿: 원래 URL이 로 다시 작성된 URL의 템플릿입니다. match_rule 에서 명명된 인수를 사용할 수 있습니다.

원본 URL의 쿼리 매개 변수는 템플릿에 지정된 쿼리 매개 변수와 병합됩니다.

예제

captures 정책으로 URL 재작성은 다음과 같이 구성됩니다.

{
  "name": "rewrite_url_captures",
  "version": "builtin",
  "configuration": {
    "transformations": [
      {
        "match_rule": "/api/v1/products/{productId}/details",
        "template": "/internal/products/details?id={productId}&extraparam=anyvalue"
      }
    ]
  }
}

APIcast로 전송된 원래 요청 URI:

https://api.example.com/api/v1/products/123/details?user_key=abc123secret

URL 다시 작성을 적용한 후 APIcast가 API 백엔드로 전송하는 URI입니다.

https://api-backend.example.com/internal/products/details?user_key=abc123secret&extraparam=anyvalue&id=123