

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# HTTP ヘッダーと Application Load Balancer
<a name="x-forwarded-headers"></a>

HTTP リクエストと HTTP レスポンスは、ヘッダーフィールドを使用して HTTP メッセージに関する情報を送信します。HTTP ヘッダーは自動的に追加されます。ヘッダーフィールドはコロンで区切られた名前と値のペアであり、キャリッジリターン (CR) とラインフィード (LF) で区切ります。HTTP ヘッダーフィールドの標準セットは、「[メッセージヘッダー](https://datatracker.ietf.org/doc/html/rfc2616)」RFC 2616 で定義されています。アプリケーションで広く使用されている標準以外の HTTP ヘッダーもあります。標準以外の HTTP ヘッダーには、`X-Forwarded` というプレフィックスが付いている場合があります。Application Load Balancer では、次の `X-Forwarded` ヘッダーがサポートされます。

HTTP 接続の詳細については、*Elastic Load Balancing ユーザーガイド*の [Request routing](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/how-elastic-load-balancing-works.html#request-routing) を参照してください。

**Topics**
+ [X-Forwarded-For](#x-forwarded-for)
+ [X-Forwarded-Proto](#x-forwarded-proto)
+ [X-Forwarded-Port](#x-forwarded-port)

## X-Forwarded-For
<a name="x-forwarded-for"></a>

`X-Forwarded-For` リクエストヘッダーは、HTTP または HTTPS ロードバランサーを使用する場合に、クライアントの IP アドレスを識別するのに役立ちます。ロードバランサーはクライアント/サーバー間のトラフィックをインターセプトするので、サーバーアクセスログにはロードバランサーの IP アドレスのみが含まれます。クライアントの IP アドレスを確認するには、`routing.http.xff_header_processing.mode` 属性を使用します。この属性を使用すると、Application Load Balancer がターゲットにリクエストを送信する前に、HTTP リクエストの `X-Forwarded-For` ヘッダーを変更、保持、削除できます。この属性に指定できる値は、`append`、`preserve`、および `remove` です。この属性のデフォルト値は `append` です。

**重要**  
`X-Forwarded-For` ヘッダーはセキュリティ上のリスクの可能性があるため慎重に使用する必要があります。エントリは、ネットワーク内で適切に保護されているシステムによって追加された場合にのみ信頼できるとみなすことができます。

**Topics**
+ [Append](#x-forwarded-for-append)
+ [Preserve](#x-forwarded-for-preserve)
+ [削除](#x-forwarded-for-remove)

### Append
<a name="x-forwarded-for-append"></a>

デフォルトでは、Application Load Balancer は、クライアントの IP アドレスを `X-Forwarded-For` リクエストヘッダーに格納し、このヘッダーをサーバーに渡します。`X-Forwarded-For` リクエストヘッダーがオリジナルリクエストに含まれていない場合、ロードバランサーはリクエスト値としてクライアント IP アドレスを持つリクエストヘッダーを作成します。それ以外の場合、ロードバランサーはクライアント IP アドレスを既存のヘッダーに追加し、その後ヘッダーをサーバーに渡します。`X-Forwarded-For` リクエストヘッダーには、カンマで区切られた複数の IP アドレスを含めることができます。

`X-Forwarded-For` リクエストヘッダーは以下のような形式です。

```
X-Forwarded-For: client-ip-address
```

以下に、IP アドレスが `203.0.113.7` であるクライアントの `X-Forwarded-For` リクエストヘッダーの例を示します。

```
X-Forwarded-For: 203.0.113.7
```

以下に、IPv6 アドレスが `X-Forwarded-For` であるクライアントの `2001:DB8::21f:5bff:febf:ce22:8a2e` リクエストヘッダーの例を示します。

```
X-Forwarded-For: 2001:DB8::21f:5bff:febf:ce22:8a2e
```

ロードバランサーでクライアントポート保持属性 (`routing.http.xff_client_port.enabled`) が有効になっている場合、`X-Forwarded-For` リクエストヘッダーには、`client-ip-address` の後にコロンで区切って `client-port-number` が含まれます。ヘッダーは、次のような形式になります。

```
IPv4 -- X-Forwarded-For: client-ip-address:client-port-number
```

```
IPv6 -- X-Forwarded-For: [client-ip-address]:client-port-number
```

IPv6 の場合、ロードバランサーが `client-ip-address` を既存のヘッダーに追加する際には、アドレスが角括弧で囲まれることに注意してください。

以下に、IPv4 アドレスが `12.34.56.78` で、ポート番号が `8080` であるクライアントの `X-Forwarded-For` リクエストヘッダーの例を示します。

```
X-Forwarded-For: 12.34.56.78:8080
```

以下に、IPv6 アドレスが `2001:db8:85a3:8d3:1319:8a2e:370:7348` で、ポート番号が `8080` であるクライアントの `X-Forwarded-For` リクエストヘッダーの例を示します。

```
X-Forwarded-For: [2001:db8:85a3:8d3:1319:8a2e:370:7348]:8080
```

### Preserve
<a name="x-forwarded-for-preserve"></a>

属性で `preserve` モードを指定した場合、HTTP リクエストの `X-Forwarded-For` ヘッダーは、ターゲットに送信される前に変更されることはありません。

### 削除
<a name="x-forwarded-for-remove"></a>

属性に `remove` モードを指定した場合、HTTP リクエストの `X-Forwarded-For` ヘッダーは、ターゲットに送信される前に削除されます。

クライアントポート保持の属性を有効にし (`routing.http.xff_client_port.enabled`)、かつ `routing.http.xff_header_processing.mode` 属性 に `preserve` または `remove` を選択した場合、Application Load Balancer はクライアントポート保持属性を上書きします。選択したモードに応じて、`X-Forwarded-For` ヘッダーを変更せずにおくか削除するかして、ターゲットに送信します。

次の表では、`append`、`preserve`、`remove` モードのいずれかを選択した際にターゲットが受信する `X-Forwarded-For` ヘッダーの例を示します。この例では、ラストホップの IP アドレスは `127.0.0.1` です。


| リクエストの説明 | リクエスト例 | append | preserve | remove | 
| --- | --- | --- | --- | --- | 
| リクエストは XFF ヘッダーを含まずに送信されます | GET /index.html HTTP/1.1 Host: example.com | X-Forwarded-For: 127.0.0.1 | [なし] | [なし] | 
| リクエストは、XFF ヘッダーとクライアント IP アドレスを含んで送信されます。 | GET /index.html HTTP/1.1 Host: example.com X-Forwarded-For: 127.0.0.4 | X-Forwarded-For: 127.0.0.4, 127.0.0.1 | X-Forwarded-For: 127.0.0.4 | [なし] | 
| リクエストは、複数のクライアント IP アドレスを含む XFF ヘッダーを含んで送信されます。 | GET /index.html HTTP/1.1 Host: example.com X-Forwarded-For: 127.0.0.4, 127.0.0.8 | X-Forwarded-For: 127.0.0.4, 127.0.0.8, 127.0.0.1 | X-Forwarded-For: 127.0.0.4, 127.0.0.8 | [なし] | 

------
#### [ Console ]

**X-Forwarded-For ヘッダーを管理するには**

1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

1. ナビゲーションペインで、[**ロードバランサー**] を選択します。

1. ロードバランサーを選択します。

1. **[属性]** タブで、**[編集]** を選択します。

1. **[トラフィックの設定]** セクションの **[パケット処理]** にある **[X-Forwarded-For ヘッダー]** で、**[付加]** (デフォルト)、**[保持]**、または **[削除]** を選択します。

1. **[Save changes]** (変更の保存) をクリックします。

------
#### [ AWS CLI ]

**X-Forwarded-For ヘッダーを管理するには**  
`routing.http.xff_header_processing.mode` 属性を指定して [modify-load-balancer-attributes](https://docs.aws.amazon.com/cli/latest/reference/elbv2/modify-load-balancer-attributes.html) コマンドを使用します。指定できる値は、`append`、`preserve`、および `remove` です。デフォルトは `append` です。

```
aws elbv2 modify-load-balancer-attributes \
    --load-balancer-arn load-balancer-arn \
    --attributes "Key=routing.http.xff_header_processing.mode,Value=preserve"
```

------
#### [ CloudFormation ]

**X-Forwarded-For ヘッダーを管理するには**  
[AWS::ElasticLoadBalancingV2::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-loadbalancer.html) リソースを更新して、`routing.http.xff_header_processing.mode` 属性を含めます。指定できる値は、`append`、`preserve`、および `remove` です。デフォルトは `append` です。

```
Resources:
  myLoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Name: my-alb
      Type: application
      Scheme: internal
      Subnets: 
        - !Ref subnet-AZ1
        - !Ref subnet-AZ2
      SecurityGroups: 
        - !Ref mySecurityGroup
      LoadBalancerAttributes: 
        - Key: "routing.http.xff_header_processing.mode"
          Value: "preserve"
```

------

## X-Forwarded-Proto
<a name="x-forwarded-proto"></a>

`X-Forwarded-Proto` リクエストヘッダーを使用すると、クライアントがロードバランサーへの接続に使用したプロトコル (HTTP または HTTPS) を識別することができます。サーバーアクセスログには、サーバーとロードバランサーの間で使用されたプロトコルのみが含まれ、クライアントとロードバランサーの間で使用されたプロトコルに関する情報は含まれません。クライアントとロードバランサーの間で使用されたプロトコルを判別するには、`X-Forwarded-Proto` リクエストヘッダーを使用します。Elastic Load Balancing は、クライアントとロードバランサーの間で使用されたプロトコルを `X-Forwarded-Proto` リクエストヘッダーに格納し、このヘッダーをサーバーに渡します。

アプリケーションやウェブサイトは `X-Forwarded-Proto` リクエストヘッダーに格納されているプロトコルを使用して、適切な URL にリダイレクトする応答を生成できます。

`X-Forwarded-Proto` リクエストヘッダーは以下のような形式です。

```
X-Forwarded-Proto: originatingProtocol
```

次の例には、HTTPS リクエストとしてクライアントから発信されたリクエストの `X-Forwarded-Proto` リクエストヘッダーが含まれています。

```
X-Forwarded-Proto: https
```

## X-Forwarded-Port
<a name="x-forwarded-port"></a>

`X-Forwarded-Port` リクエストヘッダーは、ロードバランサーへの接続にクライアントが使用した送信先ポートを識別するために役立ちます。