Sigv4とは何か、そしてその動作方法は何でしょうか。

# 初めに
この記事はエアークローゼット Advent Calendar 2023 3日目の記事になります

https://qiita.com/advent-calendar/2023/air-closet

# この記事のまとめ
・Sigv4とは何ですか？
・それを使用する方法
# SigV4とは？
AWS Signature Version 4（SigV4）は、AWSサービスへのリクエストを認証するためのプロセスです。これは、AWS APIリクエストに署名するために使用される最新バージョンの認証プロトコルです。署名されたリクエストは、不正アクセス、データ操作、および正当なクライアントからの認証されたリクエストがのみ行われることを確認するために使用されます。

AWSサービスにリクエストを送信する場合、SigV4を使用して計算された署名を含める必要があります。署名は、HTTPメソッド、ヘッダー、URI、クエリパラメータ、およびペイロードを含むリクエストペイロードの規定表現に基づいています。この規格表現は、AWS秘密アクセスキーを使用して署名され、最終的な署名が生成されます。

AWSのSigV4は、以前のバージョンよりも堅牢な署名プロセスを使用します。リージョンベースの認証のサポートや、一時的なセキュリティ資格情報の使用のサポートなど、追加の機能を提供します。また、SigV4では、輸送中のデータ機密性と整合性を確保するために、Transport Layer Security（TLS）の使用が必要です。
# 動作方法
以下はSigV4の動作方法の簡単な説明です。
1. リクエストを構成する：クライアントは、HTTPメソッド、URIパス、ヘッダーフィールド、リクエストペイロード、オプションのクエリ文字列パラメータなどの特定の情報を含むHTTPリクエストをAWSサービスに送信します。

2. 正準表現を作成する：クライアントは、リクエストデータの標準化されたバージョンである正準表現を作成します。これにより、データが処理目的に一貫してフォーマットされ、順序付けられます。

3. ペイロードをハッシュ化する：クライアントは、リクエストペイロードのSHA-256ハッシュ値を計算します。

4. 署名文字列を作成する：クライアントは、使用されるアルゴリズム、タイムスタンプ、資格スコープ、および正規要求を含む複数の要素を組み合わせて署名文字列を作成します。

5. 署名キーを導出する：クライアントは、クライアントのシークレットアクセスキーと、特定のデータのハッシュ操作のシリーズを使用して、署名キーを導出します。

6. 署名を生成する：クライアントは、署名キーを署名文字列に適用することでHMAC-SHA256署名を生成します。

7. 認証情報をリクエストに追加する：クライアントは、生成された署名、アクセスキーID、および資格スコープなどの認証情報をリクエストヘッダーに追加します。

8. 認証済みリクエストを送信する：クライアントは認証済みのリクエストをAWSサービスに送信し、サービスが署名を検証して認証します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2957202/85ae6b6c-56d7-e3de-3096-25e8ef4b47d2.png)
# 実装
クライアントからリクエストを受け取った後、リクエストボディをハッシュ化して署名を生成します。
``` js
import { HttpRequest } from '@aws-sdk/protocol-http';
import aws4 from 'aws4';
import * as crypto from 'crypto';

const createSignature = async (url, httpMethod, body) => {
  const credentials = {
    accessKeyId: 'accessKeyId',
    secretAccessKey: 'secretAccessKey',
    sessionToken: 'sessionToken',
  };

  const httpRequest = new HttpRequest({
    headers: {
      host: 'hostname',
      'X-Amz-Content-Sha256': crypto
        .createHash('sha256')
        .update(body, 'utf8')
        .digest('hex'),
    },
    hostname: 'hostname',
    method: httpMethod,
    path: 'pathname', // include query string if needed
  });

  const signedRequest = aws4.sign(httpRequest, credentials);

  return {
    Authorization: signedRequest.headers.Authorization,
    'X-Amz-Date': signedRequest.headers.['X-Amz-Date'],
    'X-Amz-Security-Token': signedRequest.headers.['X-Amz-Security-Token'],
    'X-Amz-Content-Sha256': signedRequest.headers.['X-Amz-Content-Sha256'],
  };
}
```

クライアントは認証済みのリクエストをAWSサービスに送信し、サービスが署名を検証して認証します。

``` js
import axios from 'axios';

const callApi = async () => {
  const signedHeaders = await createSignature(url, httpMethod, body);
  await axios.put(url, body, {
        proxy: false,
        headers: {
          ...signedHeaders,
          withCredentials: true,
        },
        withCredentials: true,
      });
}
```

# まとめ
要約すると、AWS Signature Version 4は、リクエストを構成し、正準表現を作成し、ペイロードをハッシュ化し、署名文字列を作成し、署名キーを導出し、署名を生成し、認証情報をリクエストに追加し、最後にAWSサービスに認証されたリクエストを送信して、検証と認証を行うプロセスを使用します。

最後までご覧いただきありがとうございました！

[エアークローゼット Advent Calendar 2023](https://qiita.com/advent-calendar/2023/air-closet)はまだまだ続きますので、ぜひ他のエンジニア, デザイナー, PMの記事もご覧いただければと思います