5장. APIcast 정책

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

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

정책 체인이 있는 서비스에 대한 제어 정책입니다. 정책 체인에서는 다음을 수행합니다.

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

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

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

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

5.1. APIcast 표준 정책

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

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

5.1.1. 3scale Auth Caching 정책

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

3scale Auth Caching은 다음 모드에서 사용할 수 있습니다.

1. strict - 권한 있는 호출만 캐시합니다.

"제한" 모드는 권한 있는 호출만 캐시합니다. 정책이 "제한" 모드에서 실행되고 호출이 실패하거나 거부되면 정책이 캐시 항목을 무효화합니다. 백엔드에 연결할 수 없게 되면 캐시된 모든 호출이 해당 캐시된 상태와 관계없이 거부됩니다.

2. 복원력 - 백엔드가 다운될 때 마지막 요청에 따라 승인합니다.

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

3. allow - 백엔드가 다운되면 이전에 보거나 거부하지 않는 한 모든 항목을 허용하십시오.

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

중요

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

4. none - 캐싱을 비활성화합니다.

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

구성 속성

속성description필수 여부

caching_type

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

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

제공됨

정책 오브젝트 예

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

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

5.1.2. 3scale Batcher Policy

3scale Batcher 정책은 표준 APIcast 인증 메커니즘에 대한 대안을 제공합니다. 이 메커니즘은 3scale 백엔드(Service Management API)에 대한 호출이 각 API 요청 APIcast 수신에 대해 이루어집니다.

3scale Batcher 정책은 3scale 백엔드에 대한 요청 수를 크게 줄여 대기 시간을 줄이고 처리량을 증가시킵니다. 이를 위해 이 정책은 권한 부여 상태를 캐시하고 사용 보고서를 일괄 처리합니다.

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: 권한 부여 캐시가 만료되는 시간(초)을 설정합니다.

    현재 호출에 대한 인증이 캐시되면 APIcast는 캐시된 값을 사용합니다. auths_ttl 매개변수에 설정된 시간이 지나면 APIcast는 캐시를 제거하고 3scale 백엔드를 호출하여 권한 부여 상태를 검색합니다.

  • batch_report_seconds: 배치의 빈도를 3scale 백엔드에 APIcast로 보냅니다. 기본값은 10 초입니다.
중요

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

5.1.3. 익명 액세스 정책

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

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

참고

이 두 정책을 정책 체인에 함께 사용할 때 APIcast 정책 앞에 무명 액세스 정책을 배치해야합니다.

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

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

    • app_id_and_app_key: 앱 ID / 앱 키 인증 옵션입니다.
    • user_key: API 키 인증 옵션입니다.
  • app_id ( app_id_and_app_key auth 유형 전용): API 호출을 통해 인증 정보가 제공되지 않는 경우 권한 부여에 사용되는 애플리케이션의 앱 Id입니다.
  • app_key ( app_id_and_app_key auth 유형 전용): API 호출과 함께 자격 증명이 제공되지 않는 경우 권한 부여에 사용되는 애플리케이션의 앱 키입니다.
  • user_key ( user_key auth_type 전용): API 호출이 제공된 인증 정보가 없는 경우 권한 부여에 사용할 애플리케이션의 API 키입니다.

그림 5.1. 익명 액세스 정책

익명 액세스 정책

5.1.4. CORS 요청 처리 정책

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

  • 허용된 헤더
  • 허용되는 방법
  • 인증 정보 허용
  • 허용된 원본 헤더

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

참고

이 두 정책을 정책 체인에서 함께 사용할 때 APIcast 정책 전에 CORS 요청 처리 정책을 배치해야합니다.

구성 속성

속성description필수 여부

allow_headers

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

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

제공되지 않음

allow_methods

allow_methods 속성은 허용할 CORS 방법 APIcast를 지정할 수 있는 배열입니다.

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

제공되지 않음

allow_origin

allow_origin 속성을 사용하면 origin 도메인 APIcast를 허용 할 수 있습니다.

데이터 유형: 문자열

제공되지 않음

allow_credentials

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

데이터 유형: boolean

제공되지 않음

정책 오브젝트 예

{
  "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"
  }
}

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

5.1.5. echo Policy

echo 정책은 들어오는 요청을 클라이언트에 다시 출력하고 선택적 HTTP 상태 코드를 출력합니다.

구성 속성

속성description필수 여부

status

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

데이터 유형: 정수

제공되지 않음

exit

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

데이터 유형: 열거된 문자열 [request, set]

제공됨

정책 오브젝트 예

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

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

5.1.6. 엣지 제한 정책

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

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

5.1.6.1. 제한 유형

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

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

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

5.1.6.2. 제한 정의

제한에는 제한을 정의하는 데 사용되는 엔티티(IP, 서비스, 엔드포인트, ID, 특정 헤더의 값 등)를 인코딩하는 키가 있습니다. Key는 제한자의 매개변수에 지정됩니다.

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

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

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

    • 일반 텍스트(일반)
    • as Liquid (Liquid)

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

  • leaky_bucket_limiters:속도,버스트.

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

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

예제

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

    {
      "key": { "name": "service_A" },
      "count": 10,
      "window": 60
    }
  2. 1s의 지연으로 10개의 버스트가 있는 100개의 연결을 허용합니다.

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

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

5.1.6.3. 유동 템플릿

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

예제:

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

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

5.1.6.4. 조건 적용

이 조건은 API 게이트웨이가 제한자를 적용하는 시기를 정의합니다. 각 제한자의 조건 속성에 작업을 하나 이상 지정해야 합니다.

조건은 다음 속성으로 정의됩니다.

  • combine_op. 작업 목록에 적용된 부울 연산자입니다. 다음 두 개의 값이 지원됩니다. 또는 .
  • 작업. 평가해야 하는 조건 목록입니다. 각 작업은 다음 속성을 사용하여 개체에 의해 표시됩니다.

    • left: 작업의 왼쪽 부분입니다.
    • left_type: 왼쪽 속성이 평가되는 방법(plain 또는object)입니다.
    • 오른쪽: 작업의 올바른 부분입니다.
    • right_type: 올바른 속성이 평가되는 방법(plain 또는object)입니다.
    • Op: Operator는 왼쪽과 오른쪽 부분 사이에 적용됩니다. 다음의 두 가지 값이 지원됩니다: == (equals)와 != (동일하지 않음).

예제:

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

5.1.6.5. 저장소 구성

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

5.1.6.6. 오류 처리

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

  • limits_exceed_error 는 구성된 제한을 초과할 때 클라이언트에 반환되는 오류 상태 코드와 메시지를 구성할 수 있습니다. 다음 매개 변수를 구성해야 합니다.

    • status_code: 제한을 초과할 때 요청의 상태 코드입니다. 기본값: 429.
    • error_handling: 오류를 처리하는 방법

      • exit: "오류와 일치".
      • Log: "요청을 통과하고 출력 로그만 전달"
  • configuration_error 는 잘못된 구성 시 클라이언트에 반환되는 오류 상태 코드와 메시지를 구성할 수 있습니다. 다음 매개 변수를 구성해야 합니다.

    • status_code : 구성 문제가 있을 때 상태 코드입니다. 기본값: 500.
    • error_handling: 오류를 처리하는 방법

      • exit: "오류와 일치".
      • Log: "요청을 통과하고 출력 로그만 전달".

5.1.7. 헤더 수정 정책

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

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

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

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

  • 적용할 작업을 지정합니다. add 작업은 기존 헤더에 값을 추가합니다. set 작업은 헤더와 값을 생성하고 이미 존재하는 경우 기존 헤더의 값을 덮어씁니다. 내보내기 작업은 헤더와 값을 생성하지만 이미 존재하는 경우 기존 헤더의 값을 덮어쓰지 않습니다. 대신 push 는 기존 헤더에 값을 추가합니다. 삭제 작업은 헤더를 제거합니다.
  • header: 만들거나 수정할 헤더를 지정하고 헤더 이름(예: Custom-Header)으로 사용할 수 있는 문자열일 수 있습니다.
  • value_type: 헤더 값을 평가하는 방법을 정의하며 일반 텍스트 또는 Liquid 템플릿으로 평가에 대한 일반 일 수 있습니다. 자세한 내용은 6.1절. “정책에서 변수 및 필터 사용”의 내용을 참조하십시오.
  • value: 헤더에 사용할 값을 지정합니다. 값 유형 "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}}"
      }
    ]
  }
}

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

5.1.8. 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"
  }
}

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

5.1.9. 유동 컨텍스트 디버그 정책

참고

Liquid Context Debug 정책은 프로덕션이 아닌 개발 환경에서 디버깅 목적으로만 사용됩니다.

이 정책은 컨텍스트에서 사용할 수 있는 오브젝트와 값이 포함되어 있고 Liquid 템플릿을 평가하는 데 사용할 수 있는 JSON으로 API 요청에 응답합니다. 3scale APIcast 또는 Upstream 정책과 결합할 때 올바르게 작동하기 위해 Liquid Context Debug를 정책 체인에 배치해야합니다. 순환 참조를 피하기 위해 정책에는 중복된 오브젝트만 한 번만 포함되고 stub 값으로 대체됩니다.

정책이 활성화되면 APIcast에서 반환하는 값의 예입니다.

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

5.1.10. 로깅 정책

로깅 정책을 사용하면 각 API 서비스에 대해 APIcast(NGINX) 액세스 로그를 개별적으로 활성화하거나 비활성화할 수 있습니다. 기본적으로 이 정책은 정책 체인에서 활성화되어 있지 않습니다.

이 정책은 enable_access_logs 구성 매개변수만 지원합니다. 서비스에 대한 액세스 로깅을 비활성화하려면 정책을 활성화하고 enable_access_logs 매개변수를 선택한 후 Submit( Submit ) 버튼을 클릭합니다. 액세스 로그를 활성화하려면 enable_access_logs 매개변수를 선택하거나 Logging 정책을 비활성화합니다.

로깅 정책 구성

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

5.1.11. OAuth 2.0 토큰 인트로스펙션 정책

OAuth 2.0 Token Introspection 정책을 사용하면 토큰 발행자(Red Hat Single Sign-On)의 Token Introspection Endpoint(Red Hat Single Sign-On)를 사용하는 OpenID Connect 인증 옵션과 함께 제공되는 서비스에 사용되는 JSON 웹 토큰(JWT) 토큰을 검증할 수 있습니다.

APIcast는 auth_type 필드에서 다음 인증 유형을 지원하여 Token Introspection Endpoint 및 이 끝점을 호출할 때 사용하는 인증 정보 APIcast를 결정합니다.

use_3scale_oidc_issuer_endpoint

이 설정을 사용하면 APIcast에서 클라이언트 인증 정보(클라이언트 ID 및 클라이언트 시크릿)와 서비스 통합 페이지에 구성된 OpenID Connect Issuer 설정에서 Token Introspection Endpoint를 사용합니다.

APIcast는 token_introspection_endpoint 필드에서 OpenID Connect 발급자의 .well-known/openid-configuration 끝점을 반환합니다.

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

다음은 인증 유형이 use_3scale_oidc_issuer_endpoint 로 설정된 경우 설정 예제입니다.

"policy_chain": [
…​
  {
    "name": "apicast.policy.token_introspection",
    "configuration": {
      "auth_type": "use_3scale_oidc_issuer_endpoint"
    }
  }
…​
],
client_id+client_secret

이 옵션을 사용하면 다른 Token Introspection Endpoint 및 Client Secret APIcast를 지정하여 토큰 정보를 요청할 수 있습니다.

이 옵션을 사용하는 경우 다음 구성 매개변수를 설정합니다.

  • client_id: Token Introspection Endpoint의 클라이언트 ID를 설정합니다.
  • client_secret: Token Introspection Endpoint에 대한 클라이언트 보안을 설정합니다.
  • introspection_url: Introspection Endpoint URL을 설정합니다.

    예 5.2. client_id+client_secret으로 설정된 인증 유형

    인증 유형이 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는 기본 인증을 사용하여 토큰 의도를 승인합니다 (Authorization: Basic <token> 헤더, 여기서 < token >은 Base64로 인코딩된 < client_id>:<client_secret > 설정).

OAuth 2.0 토큰 인트로스펙션 설정

Token Introspection Endpoint 응답에는 활성 속성이 포함되어 있습니다. APIcast는 이 속성의 값을 확인합니다. 특성 값에 따라 APIcast는 호출을 승인하거나 거부합니다.

  • True: 호출이 승인되었습니다.
  • False: 호출이 Authentication Failed 오류와 함께 거부됨

이 정책을 통해 토큰을 캐시하여 동일한 JWT 토큰을 호출할 때마다 Token Introspection Endpoint를 호출하지 않도록 할 수 있습니다. Token Introspection 정책의 토큰 캐싱을 활성화하려면 max_cached_tokens 필드를 0 의 값으로 설정하여 기능을 비활성화 합니다. 또한 max_ttl_tokens 필드의 토큰에 대해 Time to Live (TTL) 값을 1 에서 3600 초로 설정할 수 있습니다.

5.1.12. referrer 정책

Referrer 정책은 Referrer Filtering 기능을 활성화합니다. 서비스 정책 체인에서 정책이 활성화되면 APIcast는 참조 매개 변수의 Service Management API (AuthRep 호출)에 향후 요청의 Referer 정책 값을 보냅니다. Referrer Filtering 작동 방법에 대한 자세한 내용은 인증 패턴Referrer Filtering 섹션을 참조하십시오.

5.1.13. rh-SSO/Keycloak 역할 점검 정책

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

다음은 type 속성이 정책 구성에서 지정하는 두 가지 유형의 역할 검사입니다.

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

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

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

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

  • Resource : 역할에 의해 제어되는 리소스 (endpoint)입니다. 이 형식은 매핑 규칙과 동일합니다. 패턴은 문자열의 시작부터 일치하고 정확한 일치를 위해 마지막에 $ 를 추가해야 합니다.
  • resource_type: 리소스 값이 평가되는 방법을 정의합니다.

    • 일반 텍스트(일반텍스트): 리소스 값을 일반 텍스트로 조정합니다. 예: /api/v1/product$.
    • Liquid text ( Liquidtext): 리소스 값에 Liquid를 사용할 수 있습니다. 예: /resource_{{ jwt.aud }} 는 클라이언트 ID( JWT aud 클레임에 포함되어 있음)를 포함하여 리소스에 대한 액세스를 관리합니다.
  • realm_roles: 이 역할을 사용하여 영역 역할을 확인합니다( Red Hat Single Sign-On 문서의 realm 역할 참조).

    영역 역할은 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 값을 평가하는 방법을 정의합니다. 일반 또는 유동적 일 수 있습니다 ( resource_type과 동일한 방식으로 작동합니다).
  • Client: 역할의 클라이언트를 지정합니다. 이 정책이 정의되지 않은 경우 이 정책은 aud 클레임을 클라이언트로 사용합니다.
  • client_type: 클라이언트 값을 평가하는 방법을 정의합니다. 일반 또는 유동적 일 수 있습니다 ( resource_type과 동일한 방식으로 작동합니다).

5.1.14. Prometheus 지표

Prometheus는 독립형 오픈 소스 시스템 모니터링 및 경고 툴킷입니다.

중요

Red Hat 3scale 릴리스의 경우 Prometheus 설치 및 구성은 지원되지 않습니다. 필요한 경우 Prometheus의 커뮤니티 버전을 사용하여 APIcast 관리 API 서비스에 대한 지표 및 경고를 시각화할 수 있습니다.

Prometheus 지표 가용성

Prometheus와 APIcast 통합은 다음 배포 옵션에 사용할 수 있습니다.

  • 자체 관리형 APIcast(호스팅 또는 온-프레미스 API 관리자 모두)
  • 온프레미스 APIcast 내장
참고

Prometheus와 APIcast 통합은 호스팅된 API 관리자 및 호스팅된 APIcast에서는 사용할 수 없습니다.

Prometheus 지표 목록

다음 메트릭을 항상 사용할 수 있습니다.

메트릭설명유형라벨

nginx_http_connections

HTTP 연결 수

게이지

state(accepted,active,handled,reading,total,waiting,writing)

nginx_error_log

APIcast 오류

카운터

level(debug,info,notice,warn,error,crit,alert,emerg)

openresty_shdict_capacity

작업자 간에 공유되는 사전의 용량

게이지

dict(모든 사전에 대해 1개)

openresty_shdict_free_space

작업자 간에 공유하는 사전의 여유 공간

게이지

dict(모든 사전에 대해 1개)

nginx_metric_errors_total

메트릭을 관리하는 Lua 라이브러리의 오류 수

카운터

-

total_response_time_seconds

클라이언트에 대한 응답을 전송하는 데 필요한 시간(초)

histogram

-

upstream_response_time_seconds

업스트림 서버의 응답 시간(초)

histogram

-

upstream_status

업스트림 서버의 HTTP 상태

카운터

status

threescale_backend_calls

3scale 백엔드(Apisonator)에 대한 요청 인증 및 보고

카운터

endpoint(authrep, auth, report), status(2xx, 4xx, 5xx)

다음 메트릭은 3scale Batcher 정책을 사용하는 경우에만 사용할 수 있습니다.

메트릭설명유형라벨

batching_policy_auths_cache_hits

3scale 배치 정책의 auths 캐시 적중

카운터

-

batching_policy_auths_cache_misses

3scale 배치 정책의 auths 캐시에 누락

카운터

-

값이 없는 메트릭

메트릭에 값이 없는 경우 메트릭이 숨겨집니다. 예를 들어 nginx_error_log 에 보고에 오류가 없으면 nginx_error_log 메트릭이 표시되지 않습니다. 이 값은 값이 있는 경우에만 표시됩니다.

5.1.15. NetNamespace 정책

NetNamespace 정책은 정책에 지정된 매핑 규칙을 사용하여 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
      }
    ]
  }
}

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

5.1.16. 업스트림 정책

Upstream 정책을 사용하면 정규식을 사용하여 Host 요청 헤더를 구문 분석하고 Private Base URL에 정의된 업스트림 URL을 다른 URL로 교체할 수 있습니다.

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

regex /foo. 및 URL 필드 newexample.com 이 포함된 정책에서 URL https://www.example.com/foo/123/newexample.com으로 교체합니다.

정책 체인 참조:

속성description필수 여부

regex

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

데이터 유형: string, 유효한 정규식 구문 여야 합니다.

제공됨

url

url 속성을 사용하여 일치 하는 경우 대체 URL을 지정할 수 있습니다.Using the url property, you can specify the replacement URL in the event of a match. 업스트림 정책은 이 URL이 유효한지 여부를 확인하지 않습니다.

데이터 유형: 문자열, 유효한 URL인지 확인

제공됨

정책 오브젝트 예

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

      }
    ]
  }
}

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

5.1.17. URL 재작성 정책

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

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

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

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

5.1.17.1. 경로 재작성을 위한 명령

다음은 명령 목록의 각 명령이 구성 매개 변수로 구성되어 있습니다.

  • Op: 적용할 운영입니다. 사용 가능한 옵션은 subgsub 입니다. sub 연산은 첫 번째 일치 항목만 지정된 정규 표현식과 교체합니다. gsub 연산이 지정된 정규 표현식과 일치하는 모든 항목을 대체합니다. subgsub 작업에 대한 설명서를 참조하십시오.
  • regex: Perl 호환 정규식을 일치시킬 수 있습니다.
  • replace: 일치 하는 경우 사용 되는 문자열입니다.
  • 옵션 (선택 사항): regex 일치가 수행되는 방법을 정의하는 옵션입니다. 사용 가능한 옵션에 대한 자세한 내용은 OpenResty Lua 모듈 프로젝트 설명서의 ngx.re.match 섹션을 참조하십시오.
  • break (선택 사항): true로 설정하면(checkbox가 활성화됨) 명령이 URL을 다시 입력하면 마지막으로 적용된 것입니다(해당 목록의 모든 후기 명령이 삭제됩니다).

5.1.17.2. 쿼리 문자열을 다시 작성하는 명령

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

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

    • Add : 기존 인수에 값을 추가합니다.
    • set: 설정되지 않은 경우 arg을 생성하고 설정 시 값을 교체하십시오.
    • push: 설정하지 않으면 arg를 생성하고 설정 시 값을 추가합니다.
    • 삭제: 인수를 삭제합니다.
  • ARG: 작업이 적용되는 쿼리 인수 이름입니다.
  • value: 쿼리 인수에 사용되는 값을 지정합니다. 값 유형 "liquid"의 경우 값은 {{ variable_from_context }} }} 형식이어야 합니다. 삭제 작업의 경우 값이 고려되지 않습니다.
  • value_type (선택 사항): 쿼리 인수 값 평가 방법 및 일반 텍스트에 대해 일반 텍스트 또는 Liquid 템플릿으로 평가에 사용할 수 있는 방법을 정의합니다. 자세한 내용은 6.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. value pushvaluepusharg 쿼리 인수에 추가 값으로 추가됩니다.
  4. 쿼리 인수 setarg원래 값은 구성된 값 setvalue 로 교체됩니다.
  5. 쿼리 인수 add arg 가 원래 URL에 없기 때문에 명령 add가 적용되지 않았습니다.

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

5.1.18. 캡처 정책을 사용하여 URL 재작성

Captures 정책을 사용한 URL 재작성 정책은 5.1.17절. “URL 재작성 정책” 정책의 대안이며 API 백엔드에 전달하기 전에 API 요청의 URL을 다시 작성할 수 있습니다.

Captures 정책을 사용하여 URL 재작성은 URL의 인수를 캡처하고 다시 작성된 URL에서 해당 값을 사용합니다.

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

  • match_rule: 이 규칙은 들어오는 요청 URL과 일치합니다. {nameOfArgument} 형식으로 이름 지정된 인수를 포함할 수 있습니다. 이러한 인수는 다시 작성된 URL에 사용할 수 있습니다. URL은 match_rule 과 정규 표현식과 비교됩니다. 명명된 인수와 일치하는 값에는 (PCRE regex 표기법의 경우) [\w-.~%!$&'()*,;=@:]+ 는 다음 문자만 포함해야 합니다. 기타 regex 토큰은 match_rule 표현식(예: ^ for the beginning of the string, $ )에서 사용할 수 있습니다.
  • template: 원본 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