すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:POST V1 署名

最終更新日:Mar 07, 2026

PostObject 操作を使用してファイルをアップロードする場合、Object Storage Service (OSS) では、各アップロードリクエストにセキュリティのための署名を含める必要があります。POST V1 署名では、AccessKey Secret を使用して、アップロードポリシーおよび有効期限などのリクエストパラメーターを含む文字列に署名し、その結果として署名を算出します。アプリケーションサーバーがこの署名を生成し、アップロードポリシーとともにクライアントに提供します。クライアントは、この情報をもとにアップロードリクエストを構築します。OSS がリクエストを受信すると、署名の認証を行います。OSS は、有効な署名を含むリクエストのみを受け付け、それ以外のリクエストはすべて拒否します。

重要

OSS では、よりセキュアな V4 署名アルゴリズムもサポートされています。セキュリティを強化するため、V4 署名の利用を推奨します。詳細については、「V4 署名」をご参照ください。

POST 署名の概要

HTTP POST リクエストでは、V1 署名アルゴリズムがサポートされています。フォームおよびポリシーは、アップロードリクエストのセキュリティおよび準拠性を確保する上で重要な役割を果たします。

フォーム

フォームとは、ファイルおよび関連するメタデータを渡すために使用される POST リクエスト内のフィールドのコレクションです。以下のフォーム要素は、POST V1 署名に固有のものです。その他の一般的なフォーム要素については、「PostObject のフォーム要素」をご参照ください。

フィールド

説明

OSSAccessKeyId

String

AccessKey ペアから取得した AccessKey ID。

デフォルト値:なし

    重要
    • バケットのアクセス制御リスト (ACL) が公開読み取り (public-read) または非公開 (private) の場合、OSSAccessKeyId フォームフィールドを指定してください。

    • Signature および policy フォームフィールドが存在する場合、OSSAccessKeyId フォームフィールドを指定してください。

Signature

String

AccessKey Secret およびポリシーから算出された署名。OSS はこの署名を使用して POST リクエストを認証します。詳細については、「PostObject」をご参照ください。

デフォルト値:なし

重要
  • バケットの ACL が公開読み取り (public-read) または非公開 (private) の場合、Signature フォームフィールドを指定してください。

  • OSSAccessKeyId および policy フォームフィールドが存在する場合、Signature フォームフィールドを指定してください。

  • このフォームフィールドのキーは大文字小文字を区別しませんが、値は大文字小文字を区別します。

ポリシー

ポリシーフォームフィールドは、HTML フォームを使用して OSS へファイルをアップロードする際の権限および制約を定義するセキュリティポリシーです。ポリシーは JSON 形式で定義され、許可されるバケット名、オブジェクトプレフィックス、有効期限、許可される HTTP メソッド、コンテンツサイズの制限、およびコンテンツタイプの制限などのパラメーターを用いて、アップロード操作を制限します。

重要

ポリシーには、expiration フィールドおよび conditions フィールドを必ず含めてください。

{
  "expiration": "2023-12-03T13:00:00.000Z",
  "conditions": [
    {"bucket": "examplebucket"},
    ["content-length-range", 1, 10],
    ["eq", "$success_action_status", "201"],
    ["starts-with", "$key", "user/eric/"],
    ["in", "$content-type", ["image/jpg", "image/png"]],
    ["not-in", "$cache-control", ["no-cache"]]
  ]
}

ポリシーには、以下の要素が含まれます。

  • expiration

    ポリシーの有効期限を ISO 8601 GMT 形式で指定します。たとえば、2023-12-03T13:00:00.000Z は、POST リクエストが 2023 年 12 月 3 日 13 時までに開始される必要があることを意味します。

  • conditions

    POST リクエスト内のフォームフィールドの有効な値を指定します。

    フィールド

    必須

    説明

    条件一致モード

    bucket

    String

    いいえ

    バケット名。

    bucket

    content-length-range

    String

    いいえ

    アップロード対象のオブジェクトの許容最小サイズおよび最大サイズ(バイト単位)。

    content-length-range

    success_action_status

    String

    いいえ

    アップロード成功時の状態コード。

    eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci

    key

    String

    いいえ

    アップロード対象のオブジェクト名。

    eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci

    content-type

    String

    いいえ

    アップロード対象のファイルタイプを制限します。

    eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci

    cache-control

    String

    いいえ

    オブジェクトのキャッシュ動作を指定します。

    eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci

条件一致モード

条件一致モード

説明

content-length-range

アップロード可能なファイルサイズの最小値および最大値を指定します。たとえば、1~10 バイトのファイルサイズを許容する場合は、["content-length-range", 1, 10] と記述します。

eq

完全に一致する値をチェックします。フォームフィールドの値は、conditions 内で宣言された値と完全に一致する必要があります。たとえば、key フォームフィールドの値を「a」に限定する場合は、["eq", "$key", "a"] と記述します。

starts-with

プレフィックス一致を実行します。フォームフィールドの値は、指定されたプレフィックスで始まる必要があります。たとえば、key の値が「user/user1」で始まることを要求する場合は、["starts-with", "$key", "user/user1"] と記述します。

in

値が文字列のリストに含まれているかをチェックします。たとえば、複数の画像形式を許容する場合は、["in", "$content-type", ["image/jpg", "image/png"]] を使用します。

not-in

条件内で除外する値を文字列のリストとして指定します。たとえば、PostObject API を使用してオブジェクトをアップロードする場合、オブジェクトのキャッシュ動作を指定する必要があります。「no-cache」値がサポートされていない場合、["not-in", "$cache-control", ["no-cache"]] のように not-in セマンティクスを使用して条件を指定できます。

eq-ci

大文字小文字を区別しない完全一致を実行します。フォームフィールドの値は、conditions 内で宣言された値と大文字小文字を区別せずに一致する必要があります。たとえば、["eq-ci", "$key", "AbC"] の場合、「abc」「ABC」「aBc」などのオブジェクト名がすべて一致します。

starts-with-ci

大文字小文字を区別しないプレフィックス一致を実行します。フォームフィールドの値は、指定されたプレフィックス(大文字小文字を区別せず)で始まる必要があります。たとえば、["starts-with-ci", "$key", "User/"] の場合、「user/」「USER/」「User/」で始まる値がすべて一致します。

in-ci

大文字小文字を区別しないチェックを行い、値が文字列のリストに含まれているかを確認します。たとえば、["in-ci", "$content-type", ["IMAGE/JPG", "image/PNG"]] の場合、「image/jpg」「IMAGE/PNG」などの値が一致します。

not-in-ci

大文字小文字を区別しないチェックを行い、値が文字列のリストに含まれていないかを確認します。たとえば、["not-in-ci", "$cache-control", ["No-Cache"]] の場合、「no-cache」「NO-CACHE」「No-Cache」などの値がすべて除外されます。

ポリシーのエスケープ文字

POST ポリシーでは、ドル記号 ($) は変数を表します。リテラルのドル記号を表すには、エスケープ文字 \$ を使用します。以下の表に、ポリシー JSON 内でエスケープする必要がある文字を示します。

エスケープ文字

説明

\/

スラッシュ

\\

バックスラッシュ

\”

二重引用符

\$

ドル記号

\b

空白

\f

フォームフィード

\n

改行

\r

キャリッジリターン

\t

水平タブ

\uxxxx

Unicode 文字

署名の算出プロセス

  1. UTF-8 エンコーディングされたポリシーを作成します。

  2. 署名対象文字列を構築します。

    ポリシーを Base64 エンコーディングします。その結果得られる文字列が、署名対象文字列 (StringToSign) です。

  3. 署名を算出します。

    署名対象文字列に対して AccessKey Secret を使用して署名を実行します。署名方式は Signature = base64(hmac-sha1(AccessKeySecret,base64(policy))) です。

image

POST 署名算出の完全な例

以下の Java の例では、与えられたポリシーに対する POST 署名の算出プロセス全体を示します。

import org.apache.commons.codec.binary.Base64;

public class Demo {
    public static void main(String[] args) {
        // このコード例を実行する前に、OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
        String accessKeySecret =  System.getenv().get("OSS_ACCESS_KEY_SECRET");

        // ステップ 1: ポリシーを作成します。
        String policy = "{\n" +
                "  \"expiration\": \"2023-12-03T13:00:00.000Z\",\n" +
                "  \"conditions\": [\n" +
                "    {\"bucket\": \"examplebucket\"},\n" +
                "    [\"content-length-range\", 1, 10],\n" +
                "    [\"eq\", \"$success_action_status\", \"201\"],\n" +
                "    [\"starts-with\", \"$key\", \"user/eric/\"],\n" +
                "    [\"in\", \"$content-type\", [\"image/jpg\", \"image/png\"]],\n" +
                "    [\"not-in\", \"$cache-control\", [\"no-cache\"]]\n" +
                "  ]\n" +
                "}";

        // ステップ 2: 署名対象文字列 (StringToSign) を構築します。
        String stringToSign = new String(Base64.encodeBase64(policy.getBytes()));

        // ステップ 3: 署名を算出します。
        String signature = com.aliyun.oss.common.auth.ServiceSignature.create().computeSignature(accessKeySecret, stringToSign);
        System.out.println("signature:" + signature);
    }
}

以下の結果が返されます。

signature:hR2cJnoG9uzrZLDAmrfOtUjtkSM=