

**에 대한 새로운 콘솔 환경 소개 AWS WAF**

이제 업데이트된 환경을 사용하여 콘솔의 모든 위치에서 AWS WAF 기능에 액세스할 수 있습니다. 자세한 내용은 [콘솔 작업을 참조하세요](https://docs.aws.amazon.com/waf/latest/developerguide/working-with-console.html).

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# AWS WAF JavaScript 통합
<a name="waf-javascript-api"></a>

이 섹션에서는 AWS WAF JavaScript 통합을 사용하는 방법을 설명합니다.

JavaScript 통합 APIs를 사용하여 브라우저 및 JavaScript를 실행하는 기타 디바이스에서 AWS WAF 애플리케이션 통합을 구현할 수 있습니다.

CAPTCHA 퍼즐 및 자동 문제는 브라우저가 HTTPS 엔드포인트에 액세스하는 경우에만 실행할 수 있습니다. 토큰을 획득하려면 브라우저 클라이언트가 안전한 컨텍스트에서 실행되어야 합니다.
+ 지능형 위협 API를 사용하면 클라이언트 측 자동 브라우저 챌린지를 통해 토큰 인증을 관리하고 보호된 리소스로 보내는 요청에 토큰을 포함할 수 있습니다.
+ CAPTCHA 통합 API가 지능형 위협 API에 추가되므로 클라이언트 애플리케이션에서 CAPTCHA 퍼즐의 배치와 특성을 사용자 지정할 수 있습니다. 이 API는 지능형 위협 API를 활용하여 최종 사용자가 CAPTCHA 퍼즐을 성공적으로 완료한 후 해당 페이지에서 사용할 AWS WAF 토큰을 획득합니다.

이러한 통합을 사용하면 클라이언트의 원격 프로시저 호출에 유효한 토큰이 포함되도록 할 수 있습니다. 애플리케이션 페이지에 이러한 통합 API가 있으면 유효한 토큰을 포함하지 않은 요청을 차단하는 등 완화 규칙을 보호 팩(웹 ACL)에 구현할 수 있습니다. 규칙의 Challenge 또는 CAPTCHA 작업을 사용하여 클라이언트 애플리케이션이 획득한 토큰을 강제로 사용하도록 하는 규칙을 구현할 수도 있습니다.

**지능형 위협 API 구현 예제**  
다음 목록은 웹 애플리케이션 페이지의 지능형 위협 API의 일반적인 구현의 기본 구성 요소를 보여줍니다.

```
<head>
<script type="text/javascript" src="protection pack (web ACL) integration URL/challenge.js" defer></script>
</head>
<script>
const login_response = await AwsWafIntegration.fetch(login_url, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: login_body
  });
</script>
```

**CAPTCHA JavaScript API 구현 예제**  
CAPTCHA 통합 API를 사용하면 최종 사용자의 CAPTCHA 퍼즐 환경을 사용자 지정할 수 있습니다. CAPTCHA 통합은 브라우저 확인 및 토큰 관리를 위해 JavaScript 지능형 위협 통합을 활용하고 CAPTCHA 퍼즐을 구성 및 렌더링하는 기능을 추가합니다.

다음 목록은 웹 애플리케이션 페이지에서 CAPTCHA JavaScript API를 일반적으로 구현하는 기본 구성 요소를 보여줍니다.

```
<head>
    <script type="text/javascript" src="<Integration URL>/jsapi.js" defer></script>
</head>

<script type="text/javascript">
    function showMyCaptcha() {
        var container = document.querySelector("#my-captcha-container");
        
        AwsWafCaptcha.renderCaptcha(container, {
            apiKey: "...API key goes here...",
            onSuccess: captchaExampleSuccessFunction,
            onError: captchaExampleErrorFunction,
            ...other configuration parameters as needed...
        });
    }
    
    function captchaExampleSuccessFunction(wafToken) {
        // Use WAF token to access protected resources
        AwsWafIntegration.fetch("...WAF-protected URL...", {
            method: "POST",
            ...
        });
    }
    
    function captchaExampleErrorFunction(error) {
        /* Do something with the error */
    }
</script>

<div id="my-captcha-container">
    <!-- The contents of this container will be replaced by the captcha widget -->
</div>
```

**Topics**
+ [토큰에 사용할 도메인 제공](waf-js-challenge-api-set-token-domain.md)
+ [콘텐츠 보안 정책과 함께 JavaScript API 사용](waf-javascript-api-csp.md)
+ [지능형 위협 JavaScript API 사용](waf-js-challenge-api.md)
+ [CAPTCHA JavaScript API 사용](waf-js-captcha-api.md)

# 토큰에 사용할 도메인 제공
<a name="waf-js-challenge-api-set-token-domain"></a>

이 섹션에서는 토큰에 추가 도메인을 제공하는 방법을 설명합니다.

기본적으로는 토큰을 AWS WAF 생성할 때 보호 팩(웹 ACL)과 연결된 리소스의 호스트 도메인을 사용합니다. AWS WAF 가 JavaScript API용으로 생성하는 토큰에 추가 도메인을 제공할 수 있습니다. 이렇게 하려면 하나 이상의 토큰 도메인으로 글로벌 변수`window.awsWafCookieDomainList`를 구성합니다.

가 토큰을 AWS WAF 생성하면의 도메인`window.awsWafCookieDomainList`과 보호 팩과 연결된 리소스의 호스트 도메인(웹 ACL)의 조합 중에서 가장 적절하고 가장 짧은 도메인을 사용합니다.

예제 설정: 

```
window.awsWafCookieDomainList = ['.aws.amazon.com']
```

```
window.awsWafCookieDomainList = ['.aws.amazon.com', 'abc.aws.amazon.com']
```

이 목록에는 공개 접미사를 사용할 수 없습니다. 예를 들면 `gov.au` 또는 `co.uk`를 목록의 토큰 도메인으로 사용할 수 없습니다.

이 목록에서 지정하는 도메인은 다른 도메인 및 도메인 구성과 호환되어야 합니다.
+ 도메인은 보호된 호스트 도메인과 보호 팩에 대해 구성된 토큰 도메인 목록(웹 ACL)을 기반으로 AWS WAF 수락할 도메인이어야 합니다. 자세한 내용은 [AWS WAF 보호 팩(웹 ACL) 토큰 도메인 목록 구성](waf-tokens-domains.md#waf-tokens-domain-lists) 단원을 참조하십시오.
+ JavaScript CAPTCHA API를 사용하는 경우 CAPTCHA API 키에 있는 하나 이상의 도메인이 `window.awsWafCookieDomainList`의 토큰 도메인 중 하나와 정확히 일치하거나 이러한 토큰 도메인 중 하나의 apex 도메인이어야 합니다.

  예를 들어 토큰 도메인 `mySubdomain.myApex.com`의 경우 API 키 `mySubdomain.myApex.com`은 정확히 일치하고 API 키 `myApex.com`은 apex 도메인입니다. 두 키 중 하나가 토큰 도메인과 일치합니다.

  API 키에 대한 자세한 내용은 [JS CAPTCHA API의 API 키 관리](waf-js-captcha-api-key.md) 섹션을 참조하세요.

`AWSManagedRulesACFPRuleSet` 관리형 규칙 그룹을 사용하는 경우 규칙 그룹 구성에 제공한 계정 생성 경로의 도메인과 일치하는 도메인을 구성할 수 있습니다. 이 구성에 대한 자세한 정보는 [ACFP 관리형 규칙 그룹을 웹 ACL에 추가](waf-acfp-rg-using.md) 섹션을 참조하세요.

`AWSManagedRulesATPRuleSet` 관리형 규칙 그룹을 사용하는 경우 규칙 그룹 구성에 제공한 로그인 경로의 도메인과 일치하는 도메인을 구성할 수 있습니다. 이 구성에 대한 자세한 정보는 [ATP 관리형 규칙 그룹을 새 보호 팩(웹 ACL)에 추가](waf-atp-rg-using.md) 섹션을 참조하세요.

# 콘텐츠 보안 정책과 함께 JavaScript API 사용
<a name="waf-javascript-api-csp"></a>

이 섹션에서는 AWS WAF apex 도메인을 허용 목록에 추가하기 위한 구성 예제를 제공합니다.

리소스에 콘텐츠 보안 정책(CSP)을 적용하는 경우 JavaScript 구현이 작동하려면 AWS WAF apex 도메인를 허용 목록에 추가해야 합니다`awswaf.com`. JavaScript SDK는 다양한 AWS WAF 엔드포인트를 호출하므로 이 도메인을 허용하면 SDK가 작동하는 데 필요한 권한이 제공됩니다.

다음은 AWS WAF apex 도메인을 허용 목록에 추가하기 위한 구성의 예입니다.

```
connect-src 'self' https://*.awswaf.com;
script-src 'self' https://*.awswaf.com;
script-src-elem 'self' https://*.awswaf.com;
```

CSP를 사용하는 리소스와 함께 JavaScript SDKs를 사용하려고 하는데 AWS WAF 도메인을 허용 목록에 추가하지 않은 경우 다음과 같은 오류가 발생합니다.

```
Refused to load the script ...awswaf.com/<> because it violates the following Content Security Policy directive: “script-src ‘self’
```

# 지능형 위협 JavaScript API 사용
<a name="waf-js-challenge-api"></a>

이 섹션에서는 클라이언트 애플리케이션에서 지능형 위협 JavaScript API를 사용하는 방법에 대한 지침을 제공합니다.

지능형 위협 APIs는 사용자의 브라우저에 대해 자동 챌린지를 실행하고 성공적인 챌린지 및 CAPTCHA 응답의 증거를 제공하는 AWS WAF 토큰을 처리하기 위한 작업을 제공합니다.

먼저 테스트 환경에서 JavaScript 통합을 구현한 다음 프로덕션 환경에서 구현합니다. 추가 코딩 지침은 다음 섹션을 참조하세요 

 

**지능형 위협 API를 사용하려면**

1. **API 설치** 

   CAPTCHA API를 사용할 경우 이 단계를 건너뛸 수 있습니다. CAPTCHA API를 설치하면 스크립트가 지능형 위협 API를 자동으로 설치합니다.

   1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/wafv2/homev2](https://console.aws.amazon.com/wafv2/homev2) AWS WAF 콘솔을 엽니다.

   1. 탐색 창에서 **애플리케이션 통합**을 선택합니다. **애플리케이션 통합** 페이지에서 탭으로 구분된 옵션을 볼 수 있습니다.

   1. **지능형 위협 통합**을 선택합니다.

   1. 탭에서 통합할 보호 팩(웹 ACL)을 선택합니다. 보호 팩(웹 ACL) 목록에는 `AWSManagedRulesACFPRuleSet` 관리형 규칙 그룹, `AWSManagedRulesATPRuleSet` 관리형 규칙 그룹 또는 `AWSManagedRulesBotControlRuleSet` 관리형 규칙 그룹의 대상 보호 수준을 사용하는 보호 팩(웹 ACL)만 포함됩니다.

   1. **JavaScript SDK** 창을 열고 통합에 사용할 스크립트 태그를 복사합니다.

   1. 애플리케이션 페이지 코드의 `<head>` 섹션에 보호 팩(웹 ACL)용으로 복사한 스크립트 태그를 삽입합니다. 이 포함으로 인해 클라이언트 애플리케이션은 페이지 로드 시 백그라운드에서 토큰을 자동으로 검색합니다.

      ```
      <head>
          <script type="text/javascript" src="protection pack (web ACL) integration URL/challenge.js” defer></script>
      <head>
      ```

      이 `<script>` 목록은 `defer` 속성으로 구성되지만 페이지에 다른 동작을 적용하려는 경우 설정을 `async`로 변경할 수 있습니다.

1. **(선택 사항) 클라이언트 토큰에 대한 도메인 구성 추가** - 기본적으로가 토큰을 AWS WAF 생성할 때 보호 팩(웹 ACL)과 연결된 리소스의 호스트 도메인을 사용합니다. JavaScript API에 추가 도메인을 제공하려면 [토큰에 사용할 도메인 제공](waf-js-challenge-api-set-token-domain.md)의 지침을 따르십시오.

1. **지능형 위협 통합 코딩** - 클라이언트가 보호되는 엔드포인트로 요청을 보내기 전에 토큰 검색이 완료되도록 코드를 작성합니다. 이미 `fetch` API를 사용하여 호출하고 있는 경우 AWS WAF 통합 `fetch` 래퍼를 대체할 수 있습니다. `fetch` API를 사용하지 않는 경우 대신 AWS WAF 통합 `getToken` 작업을 사용할 수 있습니다. 코딩 지침은 다음 섹션을 참조하세요.

1. **보호 팩(웹 ACL)에 토큰 확인 추가** - 클라이언트가 보내는 웹 요청에서 유효한 챌린지 토큰이 있는지 확인하는 하나 이상의 규칙을 보호 팩(웹 ACL)에 추가합니다. 봇 컨트롤 관리형 규칙 그룹의 대상 수준과 같이 챌린지 토큰을 확인하고 모니터링하는 규칙 그룹을 사용할 수 있으며, [CAPTCHA Challenge의 및 AWS WAF](waf-captcha-and-challenge.md)에 설명된 대로 Challenge 규칙 작업을 사용하여 확인할 수 있습니다.

   보호 팩(웹 ACL)에 추가된 규칙은 보호된 엔드포인트에 대한 요청에 클라이언트 통합에서 획득한 토큰이 포함되어 있는지 확인합니다. 유효하고 만료되지 않은 토큰이 포함된 요청은 Challenge 검사를 통과하므로 클라이언트에게 자동 챌린지를 다시 보내지 않습니다.

1. **(선택 사항) 토큰이 누락된 요청 차단** - ACFP 관리형 규칙 그룹, ATP 관리형 규칙 그룹 또는 봇 컨트롤 규칙 그룹의 대상 규칙과 함께 API를 사용하는 경우 이러한 규칙은 누락된 토큰이 있는 요청을 차단하지 않습니다. 토큰이 누락된 요청을 차단하려면 [유효한 AWS WAF 토큰이 없는 요청 차단](waf-tokens-block-missing-tokens.md)의 지침을 따르십시오.

**Topics**
+ [지능형 위협 API 사양](waf-js-challenge-api-specification.md)
+ [통합 `fetch` 래퍼 사용 방법](waf-js-challenge-api-fetch-wrapper.md)
+ [`getToken` 통합의 사용 방법](waf-js-challenge-api-get-token.md)

# 지능형 위협 API 사양
<a name="waf-js-challenge-api-specification"></a>

이 섹션에는 지능형 위협 완화 JavaScript API의 메서드 및 속성에 대한 사양이 나열되어 있습니다. 지능형 위협 및 CAPTCHA 통합에 이러한 API를 사용합니다.

**`AwsWafIntegration.fetch()`**  
 AWS WAF 통합 구현을 사용하여 HTTP `fetch` 요청을 서버로 보냅니다.

**`AwsWafIntegration.getToken()`**  
저장된 AWS WAF 토큰을 검색하여 이름이 `aws-waf-token`이고 값이 토큰 값으로 설정된 현재 페이지의 쿠키에 저장합니다.

**`AwsWafIntegration.hasToken()`**  
`aws-waf-token` 쿠키가 현재 만료되지 않은 토큰을 보유하고 있는지 여부를 나타내는 부울을 반환합니다.

CAPTCHA 통합도 사용하는 경우 [CAPTCHA JavaScript API 사양](waf-js-captcha-api-specification.md)에서 해당 사양을 참조하세요.

# 통합 `fetch` 래퍼 사용 방법
<a name="waf-js-challenge-api-fetch-wrapper"></a>

이 섹션에서는 통합 `fetch` 래퍼 사용에 대한 지침을 제공합니다.

`AwsWafIntegration` 네임스페이스에서 AWS WAF `fetch` `fetch` API에 대한 일반 `fetch` 호출을 변경하여 래퍼를 사용할 수 있습니다. AWS WAF 래퍼는 표준 JavaScript `fetch` API 호출과 동일한 모든 옵션을 지원하고 통합에 대한 토큰 처리를 추가합니다. 이 접근 방식은 일반적으로 애플리케이션을 통합하는 가장 간단한 방법입니다.

**래퍼를 구현하기 전**  
다음 예제 목록은 `AwsWafIntegration` `fetch` 래퍼를 구현하기 전의 표준 코드를 보여줍니다.

```
const login_response = await fetch(login_url, {
	    method: 'POST',
	    headers: {
	      'Content-Type': 'application/json'
	    },
	    body: login_body
	  });
```

**래퍼를 구현한 후**  
다음 목록은 `AwsWafIntegration` `fetch` 래퍼 구현과 동일한 코드를 보여줍니다.

```
const login_response = await AwsWafIntegration.fetch(login_url, {
	    method: 'POST',
	    headers: {
	      'Content-Type': 'application/json'
	    },
	    body: login_body
	  });
```

# `getToken` 통합의 사용 방법
<a name="waf-js-challenge-api-get-token"></a>

이 섹션에서는 `getToken` 작업을 사용하는 방법을 설명합니다.

AWS WAF 는 현재 토큰의 값과 `aws-waf-token` 함께 라는 쿠키를 포함하도록 보호된 엔드포인트에 대한 요청을 요구합니다.

`getToken` 작업은 저장된 AWS WAF 토큰을 검색하여 이름이 `aws-waf-token`인 현재 페이지의 쿠키에 저장하는 비동기식 API 직접 호출이며, 해당 값은 토큰 값으로 설정됩니다. 필요에 따라 페이지에서 이 토큰 쿠키를 사용할 수 있습니다.

`getToken`를 을 호출하면 다음과 같은 작업을 수행합니다.
+ 만료되지 않은 토큰을 이미 사용할 수 있는 경우 호출 시 해당 토큰이 즉시 반환됩니다.
+ 그렇지 않으면 호출 시 토큰 공급자로부터 새 토큰을 검색하고 토큰 획득 워크플로가 제한 시간 초과 전에 완료될 때까지 최대 2초간 기다립니다. 작업 제한 시간이 초과되면 오류가 발생하며, 호출 코드에서 이를 처리해야 합니다.

`getToken` 작업에는 `aws-waf-token` 쿠키가 현재 만료되지 않은 토큰을 보유하고 있는지 여부를 나타내는 `hasToken` 작업이 함께 제공됩니다.

`AwsWafIntegration.getToken()`은 유효한 토큰을 검색하여 쿠키로 저장합니다. 대부분의 클라이언트 호출은 이 쿠키를 자동으로 연결하지만 일부는 연결하지 않습니다. 예를 들어, 호스트 도메인 간에 이루어진 호출은 쿠키를 연결하지 않습니다. 다음 구현 세부 정보에서는 두 유형의 클라이언트 호출을 모두 사용하는 방법을 보여줍니다.

**`aws-waf-token` 쿠키를 연결하는 호출에 대한 기본 `getToken` 구현**  
다음 예제 목록은 로그인 요청으로 `getToken` 작업을 구현하기 위한 표준 코드를 보여줍니다.

```
const login_response = await AwsWafIntegration.getToken()
	    .catch(e => {
	        // Implement error handling logic for your use case
	    })
	    // The getToken call returns the token, and doesn't typically require special handling
	    .then(token => {
	        return loginToMyPage()
	    })
	
	async function loginToMyPage() {
	    // Your existing login code
	}
```

**`getToken`에서 토큰을 사용할 수 있게 된 후에만 양식을 제출하십시오.**  
다음 목록은 유효한 토큰을 사용할 수 있을 때까지 양식 제출을 가로채는 이벤트 리스너를 등록하는 방법을 보여줍니다.

```
<body>
	  <h1>Login</h1>
	  <p></p>
	  <form id="login-form" action="/web/login" method="POST" enctype="application/x-www-form-urlencoded">
	    <label for="input_username">USERNAME</label>
	    <input type="text" name="input_username" id="input_username"><br>
	    <label for="input_password">PASSWORD</label>
	    <input type="password" name="input_password" id="input_password"><br>
	    <button type="submit">Submit<button>
	  </form>
	
	<script>
	  const form = document.querySelector("#login-form");
	
	  // Register an event listener to intercept form submissions
	  form.addEventListener("submit", (e) => {
	      // Submit the form only after a token is available 
	      if (!AwsWafIntegration.hasToken()) {
	          e.preventDefault();
	          AwsWafIntegration.getToken().then(() => {
	              e.target.submit();
	          }, (reason) => { console.log("Error:"+reason) });
	        }
	    });
	</script>
	</body>
```

**클라이언트가 기본적으로 `aws-waf-token` 쿠키를 연결하지 않을 때 토큰 연결**  
`AwsWafIntegration.getToken()`은 유효한 토큰을 검색하여 쿠키로 저장하지만 모든 클라이언트 호출이 기본적으로 이 쿠키를 연결하는 것은 아닙니다. 예를 들어, 호스트 도메인 간에 이루어진 호출은 쿠키를 연결하지 않습니다.

`fetch` 래퍼는 이러한 사례를 자동으로 처리하지만 `fetch` 래퍼를 사용할 수 없는 경우 `aws-waf-token` 사용자 지정 `x-aws-waf-token` 헤더를 사용하여 처리할 수 있습니다. AWS WAF 는 쿠키에서 토큰을 읽는 것 외에도이 헤더에서 토큰을 읽습니다. 다음 코드는 헤더를 설정하는 예제를 보여줍니다.

```
const token = await AwsWafIntegration.getToken();
const result = await fetch('/url', {
    headers: {
        'x-aws-waf-token': token,
    },
});
```

기본적으로는 요청된 호스트 도메인과 동일한 도메인을 포함하는 토큰 AWS WAF 만 허용합니다. 모든 도메인 간 토큰에는 보호 팩(웹 ACL) 토큰 도메인 목록에 해당 항목이 필요합니다. 자세한 내용은 [AWS WAF 보호 팩(웹 ACL) 토큰 도메인 목록 구성](waf-tokens-domains.md#waf-tokens-domain-lists) 단원을 참조하십시오.

도메인 간 토큰 사용에 대한 추가 내용은 [aws-samples/aws-waf-bot-control-api-protection-with-captcha](https://github.com/aws-samples/aws-waf-bot-control-api-protection-with-captcha)를 참조하세요.

# CAPTCHA JavaScript API 사용
<a name="waf-js-captcha-api"></a>

이 섹션에서는 CAPTCHA 통합 API 사용에 대한 지침을 제공합니다.

CAPTCHA JavaScript API를 사용하면 CAPTCHA 퍼즐을 구성하고 클라이언트 애플리케이션에서 원하는 위치에 배치할 수 있습니다. 이 API는 지능형 위협 JavaScript APIs의 기능을 활용하여 최종 사용자가 CAPTCHA 퍼즐을 성공적으로 완료한 후 AWS WAF 토큰을 획득하고 사용합니다.

먼저 테스트 환경에서 JavaScript 통합을 구현한 다음 프로덕션 환경에서 구현합니다. 추가 코딩 지침은 다음 섹션을 참조하세요 

**CAPTCHA 통합 API를 사용하려면**

1. **API 설치**

   1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/wafv2/homev2](https://console.aws.amazon.com/wafv2/homev2) AWS WAF 콘솔을 엽니다.

   1. 탐색 창에서 **애플리케이션 통합**을 선택합니다. **애플리케이션 통합** 페이지에서 탭으로 구분된 옵션을 볼 수 있습니다.

   1. **CAPTCHA 통합**을 선택합니다.

   1. 통합에 사용할 나열된 JavaScript 통합 스크립트 태그를 복사합니다.

   1. 애플리케이션 페이지 코드의 `<head>` 섹션에 복사한 스크립트 태그를 삽입합니다. 이 포함으로 CAPTCHA 퍼즐을 구성 및 사용할 수 있게 됩니다.

      ```
      <head>
          <script type="text/javascript" src="integrationURL/jsapi.js" defer></script>
      </head>
      ```

      이 `<script>` 목록은 `defer` 속성으로 구성되지만 페이지에 다른 동작을 적용하려는 경우 설정을 `async`로 변경할 수 있습니다.

      또한 CAPTCHA 스크립트는 지능형 위협 통합 스크립트가 아직 없는 경우 자동으로 로드합니다. 지능형 위협 통합 스크립트는 클라이언트 애플리케이션이 페이지 로드 시 백그라운드에서 토큰을 자동으로 검색하도록 하고 CAPTCHA API 사용에 필요한 기타 토큰 관리 기능을 제공합니다.

1. **(선택 사항) 클라이언트 토큰에 대한 도메인 구성 추가** - 기본적으로가 토큰을 AWS WAF 생성할 때 보호 팩(웹 ACL)과 연결된 리소스의 호스트 도메인을 사용합니다. JavaScript API에 추가 도메인을 제공하려면 [토큰에 사용할 도메인 제공](waf-js-challenge-api-set-token-domain.md)의 지침을 따르십시오.

1. **클라이언트에 대해 암호화된 API 키 가져오기** - CAPTCHA API에는 유효한 클라이언트 도메인 목록이 포함된 암호화된 API 키가 필요합니다.는이 키를 AWS WAF 사용하여 통합과 함께 사용 중인 클라이언트 도메인이 AWS WAF CAPTCHA를 사용하도록 승인되었는지 확인합니다. API 키를 생성하려면 [JS CAPTCHA API의 API 키 관리](waf-js-captcha-api-key.md)의 지침을 따르십시오.

1. **CAPTCHA 위젯 구현 코딩** - 페이지 내 `renderCaptcha()` API 호출을 사용할 위치에서 호출을 구현합니다. 이 함수의 구성 및 사용에 대한 자세한 내용은 [CAPTCHA JavaScript API 사양](waf-js-captcha-api-specification.md) 및 [CAPTCHA 퍼즐을 렌더링하는 방법](waf-js-captcha-api-render.md) 섹션을 참조하세요.

   CAPTCHA 구현은 토큰 관리 및 토큰을 사용하는 가져오기 호출 실행을 위해 지능형 위협 통합 APIs와 통합 AWS WAF 됩니다. 이러한 API 사용에 대한 지침은 [지능형 위협 JavaScript API 사용](waf-js-challenge-api.md) 섹션을 참조하세요.

1. **보호 팩(웹 ACL)에 토큰 확인 추가** - 클라이언트가 보내는 웹 요청에서 유효한 CAPTCHA 토큰이 있는지 확인하는 하나 이상의 규칙을 보호 팩(웹 ACL)에 추가합니다. [CAPTCHA Challenge의 및 AWS WAF](waf-captcha-and-challenge.md)에 설명된 대로 CAPTCHA 규칙 작업을 사용하여 확인할 수 있습니다.

   보호 팩(웹 ACL)에 추가된 규칙은 보호된 엔드포인트에 대한 요청에 클라이언트 통합에서 획득한 토큰이 포함되어 있는지 확인합니다. 유효하고 만료되지 않은 CAPTCHA 토큰을 포함하는 요청은 CAPTCHA 규칙 작업 검사를 통과하므로 최종 사용자에게 또 다른 CAPTCHA 퍼즐을 제시하지 않습니다.

JavaScript API를 구현한 후 CAPTCHA 퍼즐 시도 및 솔루션에 대한 CloudWatch 지표를 검토할 수 있습니다. 지표 및 차원 세부 정보는 [계정 지표 및 차원](waf-metrics.md#waf-metrics-account) 섹션을 참조하세요.

**Topics**
+ [CAPTCHA JavaScript API 사양](waf-js-captcha-api-specification.md)
+ [CAPTCHA 퍼즐을 렌더링하는 방법](waf-js-captcha-api-render.md)
+ [에서 CAPTCHA 응답 처리 AWS WAF](waf-js-captcha-api-conditional.md)
+ [JS CAPTCHA API의 API 키 관리](waf-js-captcha-api-key.md)

# CAPTCHA JavaScript API 사양
<a name="waf-js-captcha-api-specification"></a>

이 섹션에는 CAPTCHA JavaScript API의 메서드 및 속성에 대한 사양이 나열되어 있습니다. CAPTCHA JavaScript API를 사용하여 클라이언트 애플리케이션에서 사용자 지정 CAPTCHA 퍼즐을 실행합니다.

이 API는 AWS WAF 토큰 획득 및 사용을 구성하고 관리하는 데 사용하는 지능형 위협 APIs를 기반으로 합니다. [지능형 위협 API 사양](waf-js-challenge-api-specification.md) 섹션을 참조하세요.

**`AwsWafCaptcha.renderCaptcha(container, configuration)`**  
최종 사용자에게 AWS WAF CAPTCHA 퍼즐을 제공하고 성공하면 CAPTCHA 검증으로 클라이언트 토큰을 업데이트합니다. 이 방법은 CAPTCHA 통합에서만 사용할 수 있습니다. 이 호출을 지능형 위협 API와 함께 사용하여 토큰 검색을 관리하고 `fetch` 호출에 토큰을 제공합니다. [지능형 위협 API 사양](waf-js-challenge-api-specification.md)에서 지능형 위협 API를 참조하세요.  
가 AWS WAF 전송하는 CAPTCHA 중간 광고와 달리이 방법으로 렌더링된 CAPTCHA 퍼즐은 초기 제목 화면 없이 즉시 퍼즐을 표시합니다.    
**`container`**  
페이지에 있는 대상 컨테이너 요소의 `Element` 객체입니다. 이는 일반적으로 `document.getElementById()` 또는 `document.querySelector()` 호출을 통해 검색됩니다.  
필수 항목 여부: 예  
유형: `Element`  
**구성**  
다음과 같은 CAPTCHA 구성 설정이 포함된 객체입니다.****    
**`apiKey`**   
클라이언트 도메인에 대한 권한을 활성화하는 암호화된 API 키입니다. AWS WAF 콘솔을 사용하여 클라이언트 도메인용 API 키를 생성합니다. 최대 5개의 도메인에 대해 1개 키를 사용할 수 있습니다. 자세한 내용은 [JS CAPTCHA API의 API 키 관리](waf-js-captcha-api-key.md) 단원을 참조하세요.  
필수 항목 여부: 예  
유형: `string`  
**`onSuccess: (wafToken: string) => void;`**   
최종 사용자가 CAPTCHA 퍼즐을 성공적으로 완료하면 유효한 AWS WAF 토큰으로 호출됩니다. AWS WAF 보호 팩(웹 ACL)으로 보호하는 엔드포인트로 보내는 요청에서 토큰을 사용합니다. 토큰은 가장 최근에 퍼즐을 성공적으로 완료했다는 증거와 타임스탬프를 제공합니다.  
필수 항목 여부: 예  
**`onError?: (error: CaptchaError) => void;`**   
CAPTCHA 작업 중에 오류가 발생하면 오류 객체와 함께 호출됩니다.  
필수 여부: 아니요  
**`CaptchaError` 클래스 정의** - `onError` 핸들러는 다음 클래스 정의와함께 오류 유형을 제공합니다.  

```
CaptchaError extends Error {
    kind: "internal_error" | "network_error" | "token_error" | "client_error";
    statusCode?: number;
}
```
+ `kind` - 반환된 오류의 종류.
+ `statusCode` - HTTP 상태 코드(있는 경우). 이러한 클래스는 HTTP 오류로 인해 오류가 발생한 `network_error`에서 사용됩니다.  
**`onLoad?: () => void;`**   
새 CAPTCHA 퍼즐이 로드될 때 호출됩니다.  
필수 여부: 아니요  
**`onPuzzleTimeout?: () => void;`**   
CAPTCHA 퍼즐이 만료되기 전에 완료되지 않을 때 호출됩니다.  
필수 여부: 아니요  
**`onPuzzleCorrect?: () => void;`**   
CAPTCHA 퍼즐에 정답이 제공될 때 호출됩니다.  
필수 여부: 아니요  
**`onPuzzleIncorrect?: () => void;`**   
CAPTCHA 퍼즐에 오답이 제공될 때 호출됩니다.  
필수 여부: 아니요  
**`defaultLocale`**   
CAPTCHA 퍼즐에 사용할 기본 로케일입니다. CAPTCHA 퍼즐에 대한 서면 지침이 아랍어(ar-SA), 중국어 간체(zH-CN), 네덜란드어(nl-NL), 영어(en-US), 프랑스어(fr-FR), 독일어(de-DE), 이탈리아어(it-IT), 일본어(Ja-JP), 포르투갈어(Pt-Br), 스페인어(es-ES) 및 터키어(tr-TR)로 제공됩니다. 오디오 지침은 기본적으로 영어로 설정된 중국어와 일본어를 제외한 모든 서면 언어에 사용할 수 있습니다. 기본 언어를 변경하려면 국제 언어 및 로케일 코드를 입력합니다(예: `ar-SA`).  
기본값: 최종 사용자의 브라우저에서 현재 사용 중인 언어  
필수 여부: 아니요  
유형: `string`  
**`disableLanguageSelector`**   
`true`로 설정하면 CAPTCHA 퍼즐이 언어 선택기를 숨깁니다.  
기본값: `false`  
필수 여부: 아니요  
유형: `boolean`  
**`dynamicWidth`**   
`true`로 설정하면 CAPTCHA 퍼즐의 너비가 브라우저 창 너비와 호환되도록 너비가 변경됩니다.  
기본값: `false`  
필수 여부: 아니요  
유형: `boolean`  
**`skipTitle`**   
`true`로 설정하면 CAPTCHA 퍼즐에 **퍼즐 풀기**라는 제목이 표시되지 않습니다.  
기본값: `false`  
필수 여부: 아니요  
유형: `boolean`

# CAPTCHA 퍼즐을 렌더링하는 방법
<a name="waf-js-captcha-api-render"></a>

이 섹션에서는 `renderCaptcha` 구현 예제를 제공합니다.

클라이언트 인터페이스에서 AWS WAF `renderCaptcha` 원하는 위치에서 호출을 사용할 수 있습니다. 호출은 CAPTCHA 퍼즐을 검색하고 AWS WAF렌더링한 다음 확인을 AWS WAF 위해에 결과를 전송합니다. 전화를 걸 때 퍼즐 렌더링 구성과 최종 사용자가 퍼즐을 완료했을 때 실행할 콜백을 제공합니다. 옵션에 대한 자세한 내용은 앞 섹션인 [CAPTCHA JavaScript API 사양](waf-js-captcha-api-specification.md) 섹션을 참조하세요.

이 호출을 지능형 위협 통합 API의 토큰 관리 기능과 함께 사용하십시오. 이 호출은 CAPTCHA 퍼즐의 성공적인 완료를 확인하는 토큰을 클라이언트에게 제공합니다. 지능형 위협 통합 APIs를 사용하여 토큰을 관리하고 AWS WAF 보호 팩(웹 ACLs)으로 보호되는 엔드포인트에 대한 클라이언트의 호출에 토큰을 제공합니다. 지능형 위협 API에 대한 자세한 내용은 [지능형 위협 JavaScript API 사용](waf-js-challenge-api.md) 섹션을 참조하세요.

**예제 구현**  
다음 예제 목록은 `<head>` 섹션에 AWS WAF 통합 URL을 배치하는 것을 포함하여 표준 CAPTCHA 구현을 보여줍니다.

이 목록은 지능형 위협 통합 API의 `AwsWafIntegration.fetch` 래퍼를 사용하는 성공 콜백으로 `renderCaptcha` 함수를 구성합니다. 이 함수에 대한 자세한 내용은 [통합 `fetch` 래퍼 사용 방법](waf-js-challenge-api-fetch-wrapper.md) 섹션을 참조하세요.

```
<head>
    <script type="text/javascript" src="<Integration URL>/jsapi.js" defer></script>
</head>

<script type="text/javascript">
    function showMyCaptcha() {
        var container = document.querySelector("#my-captcha-container");
        
        AwsWafCaptcha.renderCaptcha(container, {
            apiKey: "...API key goes here...",
            onSuccess: captchaExampleSuccessFunction,
            onError: captchaExampleErrorFunction,
            ...other configuration parameters as needed...
        });
    }
    
    function captchaExampleSuccessFunction(wafToken) {
        // Captcha completed. wafToken contains a valid WAF token. Store it for
        // use later or call AwsWafIntegration.fetch() to use it easily.
        // It will expire after a time, so calling AwsWafIntegration.getToken()
        // again is advised if the token is needed later on, outside of using the
        // fetch wrapper.
        
        // Use WAF token to access protected resources
        AwsWafIntegration.fetch("...WAF-protected URL...", {
            method: "POST",
            headers: {
                "Content-Type": "application/json",
            },
            body: "{ ... }" /* body content */
        });
    }
    
    function captchaExampleErrorFunction(error) {
        /* Do something with the error */
    }
</script>

<div id="my-captcha-container">
    <!-- The contents of this container will be replaced by the captcha widget -->
</div>
```

**예제 구성 설정**  
다음 예제 목록은 너비 및 제목 옵션이 기본값이 아닌 값으로 설정된 `renderCaptcha`를 보여줍니다.

```
        AwsWafCaptcha.renderCaptcha(container, {
            apiKey: "...API key goes here...",
            onSuccess: captchaExampleSuccessFunction,
            onError: captchaExampleErrorFunction,
            dynamicWidth: true, 
            skipTitle: true
        });
```

구성 옵션에 대한 전체 정보는 [CAPTCHA JavaScript API 사양](waf-js-captcha-api-specification.md) 섹션을 참조하세요.

# 에서 CAPTCHA 응답 처리 AWS WAF
<a name="waf-js-captcha-api-conditional"></a>

이 섹션에서는 CAPTCHA 응답을 처리하는 예제를 제공합니다.

요청에 유효한 CAPTCHA 타임스탬프가 있는 토큰이 없는 경우 CAPTCHA 작업이 있는 AWS WAF 규칙은 일치하는 웹 요청의 평가를 종료합니다. 요청이 `GET` text/html 호출인 경우 CAPTCHA 작업은 CAPTCHA 퍼즐이 포함된 중간 광고를 클라이언트에게 제공합니다. CAPTCHA JavaScript API를 통합하지 않을 경우 중간 광고에서 퍼즐이 실행되고 최종 사용자가 문제를 성공적으로 풀면 자동으로 요청이 다시 제출됩니다.

CAPTCHA JavaScript API를 통합하고 CAPTCHA 처리를 사용자 지정하면 종료되는 CAPTCHA 응답을 감지하여 사용자 지정 CAPTCHA를 제공하고 나서, 최종 사용자가 문제를 성공적으로 해결하면 클라이언트의 웹 요청을 다시 제출해야 합니다.

다음 코드 예제에서는 이를 수행하는 방법을 보여줍니다.

**참고**  
작업 응답에는 AWS WAF CAPTCHA HTTP 405 상태 코드가 있으며,이 코드는이 코드의 CAPTCHA 응답을 인식하는 데 사용됩니다. 보호된 엔드포인트가 HTTP 405 상태 코드를 사용하여 동일한 호출에 대해 다른 유형의 응답을 전달하는 경우 이 예제 코드는 이러한 응답에 대해 CAPTCHA 퍼즐도 랜더링합니다.

```
<!DOCTYPE html>
<html>
<head>
    <script type="text/javascript" src="<Integration URL>/jsapi.js" defer></script>
</head>
<body>
    <div id="my-captcha-box"></div>
    <div id="my-output-box"></div>

    <script type="text/javascript">
    async function loadData() {
        // Attempt to fetch a resource that's configured to trigger a CAPTCHA
        // action if the rule matches. The CAPTCHA response has status=HTTP 405.
        const result = await AwsWafIntegration.fetch("/protected-resource");

        // If the action was CAPTCHA, render the CAPTCHA and return

        // NOTE: If the endpoint you're calling in the fetch call responds with HTTP 405
        // as an expected response status code, then this check won't be able to tell the
        // difference between that and the CAPTCHA rule action response.

        if (result.status === 405) {
            const container = document.querySelector("#my-captcha-box");
            AwsWafCaptcha.renderCaptcha(container, {
                apiKey: "...API key goes here...",
                onSuccess() {
                    // Try loading again, now that there is a valid CAPTCHA token
                    loadData();
                },
            });
            return;
        }

        const container = document.querySelector("#my-output-box");
        const response = await result.text();
        container.innerHTML = response;
    }

    window.addEventListener("load", () => {
        loadData();
    });
    </script>
</body>
</html>
```

# JS CAPTCHA API의 API 키 관리
<a name="waf-js-captcha-api-key"></a>

이 섹션에서는 API 키 생성 및 삭제에 대한 지침을 제공합니다.

JavaScript API를 사용하여 AWS WAF CAPTCHA를 클라이언트 애플리케이션에 통합하려면 CAPTCHA 퍼즐을 실행하려는 클라이언트 도메인에 대한 JavaScript API 통합 태그와 암호화된 API 키가 필요합니다.

JavaScript용 CAPTCHA 애플리케이션 통합은 암호화된 API 키를 사용하여 클라이언트 애플리케이션 도메인에 AWS WAF CAPTCHA API를 사용할 권한이 있는지 확인합니다. JavaScript 클라이언트에서 CAPTCHA API를 호출하면 현재 클라이언트의 도메인을 포함하는 도메인 목록이 API 키에 제공됩니다. 암호화된 키 하나에 도메인을 최대 5개까지 나열할 수 있습니다.

**API 키 요구 사항**  
CAPTCHA 통합에 사용하는 API 키에는 키를 사용하는 클라이언트에 적용되는 도메인이 포함되어야 합니다.
+ 클라이언트의 지능형 위협 통합에서 `window.awsWafCookieDomainList`를 지정하는 경우 API 키의 하나 이상의 도메인이 `window.awsWafCookieDomainList`의 해당 토큰 도메인 중 하나와 정확히 일치하거나 해당 토큰 도메인 중 하나의 apex 도메인이어야 합니다.

  예를 들어 토큰 도메인 `mySubdomain.myApex.com`의 경우 API 키 `mySubdomain.myApex.com`은 정확히 일치하고 API 키 `myApex.com`은 apex 도메인입니다. 두 키 중 하나가 토큰 도메인과 일치합니다.

  토큰 도메인 목록 설정에 대한 자세한 내용은 [토큰에 사용할 도메인 제공](waf-js-challenge-api-set-token-domain.md) 섹션을 참조하세요.
+ 그렇지 않으면 현재 도메인이 API 키에 포함되어야 합니다. 현재 도메인은 브라우저 주소 표시줄에서 볼 수 있는 도메인입니다.

사용하는 도메인은 웹 ACL에 대해 구성된 보호된 호스트 도메인 및 토큰 도메인 목록에 따라가 AWS WAF 수락할 도메인이어야 합니다. 자세한 내용은 [AWS WAF 보호 팩(웹 ACL) 토큰 도메인 목록 구성](waf-tokens-domains.md#waf-tokens-domain-lists) 단원을 참조하십시오.

**API 키의 리전을 선택하는 방법**  
AWS WAF 는를 사용할 수 있는 모든 리전에서 CAPTCHA API 키를 생성할 AWS WAF 수 있습니다.

일반적으로 보호 팩(웹 ACL)에 사용하는 리전과 동일한 리전을 CAPTCHA API 키에 사용해야 합니다. 그러나 리전 보호 팩(웹 ACL)의 글로벌 대상을 예상하는 경우 CloudFront로 범위가 지정된 CAPTCHA JavaScript 통합 태그와 CloudFront로 범위가 지정된 API 키를 가져와 리전 보호 팩(웹 ACL)과 함께 사용할 수 있습니다. 이 접근 방식을 사용하면 클라이언트가 가장 가까운 리전에서 CAPTCHA 퍼즐을 로드할 수 있으므로 지연 시간이 줄어듭니다.

CloudFront 이외의 리전으로 범위가 지정된 CAPTCHA API 키는 여러 리전에서 사용할 수 없습니다. 범위가 지정된 리전에서만 사용할 수 있습니다.

**클라이언트 도메인용 API 키 생성하려면**  
통합 URL을 가져오고 콘솔을 통해 API 키를 생성하고 검색합니다.

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/wafv2/homev2](https://console.aws.amazon.com/wafv2/homev2) AWS WAF 콘솔을 엽니다.

1. 탐색 창에서 **애플리케이션 통합**을 선택합니다.

1. **애플리케이션 통합에 활성화된 보호 팩(웹 ACL)** 창에서 API 키에 사용할 리전을 선택합니다. 또한 **CAPTCHA 통합** 탭의 **API 키** 창에서 리전을 선택할 수도 있습니다.

1. **CAPTCHA 통합** 탭을 선택합니다. 이 탭은 통합에서 사용할 수 있는 CAPTCHA JavaScript 통합 태그와 API 키 목록을 제공합니다. 둘 다 선택한 리전으로 범위가 지정됩니다.

1. **API 키** 창에서 **키 생성**을 선택합니다. 키 생성 대화 상자가 나타납니다.

1. 키에 포함할 클라이언트 도메인을 입력합니다. 최대 5개를 입력할 수 있습니다. 작업을 마쳤으면 **키 생성**을 선택합니다. 인터페이스가 새 키가 나열된 CAPTCHA 통합 탭으로 돌아갑니다.

   API 키는 생성하고 나면 변경할 수 없습니다. 키를 변경해야 하는 경우 새 키를 생성하여 대신 사용하십시오.

1. (선택 사항) 통합에 사용할 수 있도록 새로 생성된 키를 복사합니다.

이 작업에 REST APIs 또는 언어별 AWS SDKs 있습니다. REST API 호출은 [CreateAPIKey](https://docs.aws.amazon.com/waf/latest/APIReference/API_CreateAPIKey.html) 및 [ListAPIKeys](https://docs.aws.amazon.com/waf/latest/APIReference/API_ListAPIKeys.html).

**API 키를 삭제하는 방법**  
API 키를 삭제하려면 REST API 또는 언어별 AWS SDKs 중 하나를 사용해야 합니다. REST API 호출은 [DeleteAPIKey](https://docs.aws.amazon.com/waf/latest/APIReference/API_DeleteAPIKey.html)입니다. 콘솔을 사용하여 키를 삭제할 수 없습니다.

키를 삭제한 후가 모든 리전에서 키 사용을 허용하지 않는 AWS WAF 데 최대 24시간이 걸릴 수 있습니다.