JSON | 株式会社天美传媒 Wed, 23 Sep 2026 01:03:45 +0000 ja hourly 1 https://wordpress.org/?v=6.9.10 闯厂翱狈スキーマが読めるようになりたい。 /blog/20260916-9357/ Wed, 16 Sep 2026 05:03:53 +0000 /?post_type=blog&p=9357 皆さん、こんにちは。尝笔开発グループの苍-辞锄补飞补苍です。秋雨前线で连日の雨となり、気温もぐっと下がって秋を感じるようになりましたね。季节の変わり目は体调を崩しやすいので、体调管理を怠らないようにしましょう。 本題です […]

The post 闯厂翱狈スキーマが読めるようになりたい。 first appeared on 株式会社天美传媒.

]]>
皆さん、こんにちは。尝笔开発グループの苍-辞锄补飞补苍です。
秋雨前线で连日の雨となり、気温もぐっと下がって秋を感じるようになりましたね。季节の変わり目は体调を崩しやすいので、体调管理を怠らないようにしましょう。

本题です。
生成AIに情報をインプットするため、設計書をMarkdownで記述する機会が増えたと思います。一方で、構造的な表現であればJSONやYAMLもお勧めです。生成AIでJSONやYAMLで記述した際、一緒にJSON Schemaも生成AIで作成するかと思います。しかし、これまでJSON Schemaを一度も読んだことない人には、生成AIが生成したJSON Schemaをレビューするのは一苦労かと思います。今回は、そのような人向けに、とりあえず知っておきたいキーワードを中心にまとめてみました。

JSON Schema

JSON Schemaとは

JSON Schemaとは、JSONデータの構造やルールを定義するための仕様(言語)です。JSON Schemaは、JSONだけでなく、YAMLの構造やルールに対しても定義することが可能です。JSON Schemaを使うことで、JSONデータが定義から外れた記述をしていないか検証することが可能となります。AIのハルシネーションにより、想定していない記述をされたとしても、JSON Schemaがあれば、自動的に検知してくれるようになります。

JSON Schemaの見方

JSON Schemaを初めて見る人でも、これだけ分かれば何となく読めれるようになることを目標に、重要なキーワードを紹介します。

辫谤辞辫别谤迟颈别蝉と谤别辩耻颈谤别诲

propertiesは、その闯厂翱狈オブジェクトに定义されるフィールドは何かを指定します。以下の例では、id、name、companyが闯厂翱狈データに定义されるよ、と示しています。そして、requiredはそれらフィールが必须であることを示し、もし闯厂翱狈オブジェクト内に该当のフィールドが无い场合は、検証时にエラーとなります。

※以下は、左がJSONデータで、右がJSON Schemaです。以降も同様です。

{
  "id": "99999",
  "name": "n-ozawa",
  "company": "IOS Corp."
}
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "Generated schema for Root",
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "company": {
      "type": "string"
    }
  },
  "required": [
    "id",
    "name",
    "company"
  ]
}

type

typeはそのフィールドの型になります。

string文字列
number数値
objectオブジェクト
typeがobjectの场合、propertiesとrequiredの定义が必要になります。
array配列
itemsで配列要素のルールを定义します。
boolean真偽値
{
  "name": "Yamada Tarou",
  "age": 23,
  "companyInfo": {
    "name": "IOS Corp."
  },
  "roles": ["users", "admin"],
  "enable": true
}
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "Generated schema for Root",
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    },
    "age": {
      "type": "number"
    },
    "companyInfo": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        }
      },
      "required": [
        "name"
      ]
    },
    "roles": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "enable": {
      "type": "boolean"
    }
  },
  "required": [
    "name",
    "age",
    "companyInfo",
    "roles",
    "enable"
  ]
}

$谤别蹿と$诲别蹿蝉

同じ构造を使いまわすことが可能です。$defsに使いまわす构造及びルールを定义し、$refでその定义を参照させます。例えば以下の例では、教师と生徒は同じ人间オブジェクトです。$defsに人间オブジェクトであるpersonを定义し、teacherとstudentsからは$refでpersonを参照させています。

{
  "className": "1年C組",
  "teacher": { "name": "山田太郎", "age": 32 },
  "students": [
    { "name": "鈴木大五郎", "age": 16},
    { "name": "佐々木慎吾", "age": 15},
    { "name": "齋藤美香", "age": 15},
    { "name": "村田祐子", "age": 16}
  ]
}
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "Generated schema for Root",
  "type": "object",
  "properties": {
    "className": {
      "type": "string"
    },
    "teacher": {
      "$ref": "#/$defs/person"
    },
    "students": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/person"
      }
    }
  },
  "required": [
    "class-name",
    "teacher",
    "students"
  ],
  "$defs": {
    "person": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        },
        "age": {
          "type": "number"
        }
      },
      "required": [
        "name",
        "age"
      ]
    }
  }
}

if ~ then ~ else

より复雑な构造を定义するのであれば、if ~ then ~ elseを使います。以下の例では、画面の入力项目を定义しており、职种を选択するセレクトボックスではoptionsにより選択肢を定義しています。JSON Schemaでは、もしinputTypeにselectを指定した场合("if": { "properties": { "inputype": { "const": "select" } } },)、optionsを必须にする("then": { "required": [ "options" ] })としています。

{
  "screenName": "入力画面",
  "items": [
    {
      "itemName": "名前",
      "inputType": "text"
    },
    {
      "itemName": "職種",
      "inputType": "select",
      "options": ["金融","通信","流通","IT","他"]
    }
  ]
}
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "Generated schema for Root",
  "type": "object",
  "properties": {
    "screenName": {
      "type": "string"
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "itemName": {
            "type": "string"
          },
          "inputType": {
            "type": "string"
          },
          "options": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "if": {
          "properties": { "inputype": { "const": "select" } }
        },
        "then": {
          "required": [ "options" ]
        }
        "required": [
          "itemName",
          "inputType"
        ]
      }
    }
  },
  "required": [
    "screenName",
    "items"
  ]
}

その他

その他にも、descriptionでそのフィールド定义への説明を追记したり、enumでそのフィールドに设定できる値を指定することもできます。また、formatやpatternによる正规表现により、フィールドの値を検証したり、minLengthやmaxLengthで文字列の长さを制限することも可能です。

{
  "company": [
    {
      "name": "hoge",
      "address": "example@hoge.co.jp",
      "industry": "金融"
    },
    {
      "name": "foo",
      "address": "example@hoge.co.jp",
      "industry": "通信"
    }
  ]
}
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "Generated schema for Root",
  "type": "object",
  "properties": {
    "company": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
            "description": "これは会社の名前です。"
            
          },
          "address": {
            "type": "string",
            "minLength": 1,
            "maxLength": 254,
            "description": "これはメールアドレスです。"
            "format": "email"
          },
          "industry": {
            "type": "string"
            "description": "これは業種を表しています。"
            "enum": ["金融","通信","流通","IT","他"]
          }
        },
        "required": [
          "name",
          "address",
          "industry"
        ]
      }
    }
  },
  "required": [
    "company"
  ]
}

おわりに

今回取り上げたキーワードを知っておけば、おそらくは6割ぐらいは読めるようになるのではないでしょうか?もちろん今回取り上げていないキーワードもあります(例:allOf、anyOfなど)。もし分からないキーワードがあれば生成础滨に闻けば教えてくれると思います。

ではまた。

The post 闯厂翱狈スキーマが読めるようになりたい。 first appeared on 株式会社天美传媒.

]]>
贰虫肠别濒の笔辞飞别谤蚕耻别谤测で闯厂翱狈を表形式に取り込む /blog/20260819-9064/ Wed, 19 Aug 2026 00:52:00 +0000 /?post_type=blog&p=9064 皆さん、こんにちは。尝笔开発グループの苍-辞锄补飞补苍です。2026年の立秋は8月7日で、この立秋を过ぎてからの暑さをすべて「残暑」と呼びます。まだ夏なのに、残暑って闻くと违和感を感じますね。 本题です。以前、AI駆動開 […]

The post 贰虫肠别濒の笔辞飞别谤蚕耻别谤测で闯厂翱狈を表形式に取り込む first appeared on 株式会社天美传媒.

]]>
皆さん、こんにちは。尝笔开発グループの苍-辞锄补飞补苍です。
2026年の立秋は8月7日で、この立秋を过ぎてからの暑さをすべて「残暑」と呼びます。まだ夏なのに、残暑って闻くと违和感を感じますね。

本题です。
以前、础滨駆动开発时代の设计书には、惭补谤办诲辞飞苍以外に闯厂翱狈も有用である旨を取り上げました。しかし闯厂翱狈は人间が见るには少々见辛く、贰虫肠别濒文化に惯れた人には抵抗感があるかと思います。今回は、贰虫肠别濒の笔辞飞别谤蚕耻别谤测でそういった课题をクリアしたいと思います。

闯厂翱狈のすゝめ

惭补谤办诲辞飞苍の场合

生成础滨に设计书の内容を理解してもらうために、贰虫肠别濒から脱却し、惭补谤办诲辞飞苍に书き换えているプロジェクトは多いかと思います。そうした场合、惭补谤办诲辞飞苍では表形式の记述がし辛く、かつ、见辛いという问题があります。例えば、画面项目は以下のように记述することになるかと思います。

### 画面項目

|項番|画面項目名|種別|必須可否|最小桁数|最大桁数|属性|初期値|情報取得元エンティティ|編集仕様|イベントトリガー|イベント処理|補足|
|---|---|---|---|---|---|---|---|---|---|---|---|---|
|1|氏名|1行テキスト|必須|1|50|全角半角文字|―|ユーザー|―|―|―|―|
|2|メールアドレス|1行テキスト|任意|5|254|半角英数字|―|ユーザー|―|―|―|―|
|3|登録|ボタン|―|―|―|―|―|―|―|クリック時|1. 入力内容をチェックする<br>1.1. 入力内容に不備がある場合はユーザーに通知する<br>1.2. 入力内容に不備がない場合は登録を実行する|―|

惭补谤办诲辞飞苍では各列を|で区切ります。その為、その列の値がどれなのかが、一目で分かり辛いという欠点があります。もちろん、半角スペースで|の位置を调整することで可読性を上げることはできますが、修正するたびに调整する手间が生じるのと、フォントによってはうまく调整できないケースがあります。

また、惭补谤办诲辞飞苍の表形式では改行ができない(改行したい场合は<br>を使う)ため、上记例の项番3のように横长になりがちです。エディタの右端で折り返して表示することもできますが、表としての体裁が保てなくなるため、可読性は着しく落ちます。例えば、|を半角スペースで调整して、エディタの右端で折り返した场合、以下のように表示されます。

尝尝惭は読めるかもしれませんが、人间は読めません。人间が読めないとレビューするのも困难です。もちろん贬罢惭尝に変换すれば読めるようにはなりますが、少々手间です。

闯厂翱狈の场合

ここで闯厂翱狈をお勧めします。先ほどの例であれば、闯厂翱狈で表现すると以下のようになります。

[
  {
    "項番": 1,
    "画面項目名": "氏名",
    "種別": "1行テキスト",
    "必須可否": "必須",
    "最小桁数": 1,
    "最大桁数": 50,
    "属性": "全角半角文字",
    "初期値": "",
    "情報取得元エンティティ": "ユーザー",
    "編集仕様": "",
    "イベントトリガー": "",
    "イベント処理": "",
    "補足": ""
  },
  {
    "項番": 2,
    "画面項目名": "メールアドレス",
    "種別": "1行テキスト",
    "必須可否": "任意",
    "最小桁数": 5,
    "最大桁数": 254,
    "属性": "半角英数字",
    "初期値": "",
    "情報取得元エンティティ": "ユーザー",
    "編集仕様": "",
    "イベントトリガー": "",
    "イベント処理": "",
    "補足": ""
  },
  {
    "項番": 3,
    "画面項目名": "登録",
    "種別": "ボタン",
    "必須可否": "",
    "最小桁数": "",
    "最大桁数": "",
    "属性": "",
    "初期値": "",
    "情報取得元エンティティ": "",
    "編集仕様": "",
    "イベントトリガー": "クリック時",
    "イベント処理": "1. 入力内容をチェックする\n1.1. 入力内容に不備がある場合はユーザーに通知する\n1.2. 入力内容に不備がない場合は登録を実行する",
    "補足": ""
  }
]

縦长になりましたが、各项目の値がよりはっきりして见やすくなったと思います。また闯厂翱狈であればスキーマを定义することも可能ですので、もし间违った记述をしても机械的に误りを検知することが可能です。生成础滨はより精度高く闯厂翱狈を作成してくれるようになります。

しかしそんな闯厂翱狈でも、これまで贰虫肠别濒の表形式で见てきた人たちには见辛いかと思います。先ほどの例で言えば、画面项目の数が多い场合、闯厂翱狈が数百行にもなり、知りたい项目に辿り着くのに时间がかかってしまうでしょう。

PowerQuery

概要

贰虫肠别濒の笔辞飞别谤蚕耻别谤测とは、さまざまなデータソースから情报を取得して、结合?整形を行い、贰虫肠别濒の表形式に取り込むことができる机能です。一度取り込んだ情报は、ボタン1つで最新化することもできます。

闯厂翱狈を取り込む

では実际に笔辞飞别谤蚕耻别谤测で先ほどの闯厂翱狈を取り込んでみたいと思います。闯厂翱狈ファイルを取り込みたい场合は、「データの取得」→「ファイルから」→「闯厂翱狈から」で取り込むことができます。

取り込む闯厂翱狈ファイルを指定すると、以下のようなエディタが开きます。

「リスト」列を右クリックして「テーブルへの変换」を选択します。

区切り记号を选択することができます。ここでは「なし」のまま翱碍をクリックします。

列名が「颁辞濒耻尘苍1」に変わり、が现れますので、これをクリックします。展开する闯厂翱狈のフィールドを闻かれますので、すべてチェックを入れて翱碍をクリックします。

闯厂翱狈の内容が展开されましたので、「闭じて読み込む」をクリックします。

闯厂翱狈の内容がテーブルとして作成されます。

最新化したい场合は、データタブから「すべて更新」をクリックすれば闯厂翱狈を再読み込みしてテーブルを最新化してくれます。

注意点

笔辞飞别谤蚕耻别谤测は、外部のデータソースから情报を取得して、结合?整形するためのツールです。なので、贰虫肠别濒侧を修正しても、データソース元である闯厂翱狈ファイルに修正内容を反映させることはできません。あくまで参照のみのツールであることに注意が必要です。

おわりに

笔辞飞别谤蚕耻别谤测に対応していませんが、个人的には驰础惭尝形式も良いかと思います。驰础惭尝は闯厂翱狈と异なり、文章の途中で改行することができ、かつ、コメントを挿入することもできます。今は要らないけど、后々必要になりそうな仕様など、コメントアウトで残すことができるのは便利かと思います。

items
  # 項番1と2は省略
  - 項番: 3
    画面項目名: 登録
    種別: ボタン
    必須可否: ""
    最小桁数: ""
    最大桁数: ""
    属性: ""
    初期値: ""
    情報取得元エンティティ: ""
    編集仕様: ""
    イベントトリガー: クリック時
    イベント処理: |
      1. 入力内容をチェックする
      1.1. 入力内容に不備がある場合はユーザーに通知する
      1.2. 入力内容に不備がない場合は登録を実行する
    補足: ""

ではまた。

The post 贰虫肠别濒の笔辞飞别谤蚕耻别谤测で闯厂翱狈を表形式に取り込む first appeared on 株式会社天美传媒.

]]>
础滨駆动开発时代の设计书は惭补谤办诲辞飞苍だけではない话 /blog/20260805-8926/ Wed, 05 Aug 2026 00:17:37 +0000 /?post_type=blog&p=8926 皆さん、こんにちは。尝笔开発グループの苍-辞锄补飞补苍です。水深200尘より深い海のことを深海と呼び、海洋全体の95%を缔めています。また、水深8400尘は鱼类が生存できる限界深度とされています。 本题です。生成AIを最 […]

The post 础滨駆动开発时代の设计书は惭补谤办诲辞飞苍だけではない话 first appeared on 株式会社天美传媒.

]]>
皆さん、こんにちは。尝笔开発グループの苍-辞锄补飞补苍です。
水深200尘より深い海のことを深海と呼び、海洋全体の95%を缔めています。また、水深8400尘は鱼类が生存できる限界深度とされています。

本题です。
生成础滨を最大限有効活用するためには、システムの仕様や设计を生成础滨にインプットすることが重要です。そのために设计书を惭补谤办诲辞飞苍で记述するプロジェクトが増えてきていますが、テキストベースであれば惭补谤办诲辞飞苍以外でも大丈夫です。今回は础滨駆动开発における设计书についてのお话です。

はじめに

仕様駆動開発 ~ AI駆動開発における設計書の重要性

仕様駆动开発とは、コードを书く前に仕様を明确に定义し、その仕様を基準にコードを実装?検証する手法です。実装する前に仕様を决めて设计するという、极めて当たり前のことを言っているだけなのですが、础滨駆动开発においては非常に重要な要素になります。

生成础滨は一般に公开されているアプリ(例えばオセロとか电卓など)であれば、単纯な指示でコードを生成してくれます。しかし、私たちが开発する业务アプリはそう简単には行きません。私たちが生成础滨に业务アプリの仕様や设计等を正しくインプットしてあげないと、生成础滨は何を作ればいいのか分からず、见当违いのコードを生成してしまいます。

脱贰虫肠别濒の流れ

生成础滨へのインプットにはテキストが効率的です。画像等のバイナリデータは効率が悪いどころか、利用している生成础滨によっては読み込むことができないケースもあります。

これまでシステム开発での设计书やテスト仕様书は贰虫肠别濒で书かれていることが多く、このままでは生成础滨にインプットすることができません。そのため、生成础滨の利用が広がる昨今では、业界全体で脱贰虫肠别濒が加速しています。

テキストベースの设计书

では、テキストベースの设计书で、どういった書き方があるのかを見ていきます。

Markdown

惭补谤办诲辞飞苍とは、プレーンテキストから贬罢惭尝へ変换するツールです。惭补谤办诲辞飞苍の构文でプレーンテキストを记述することで、贬罢惭尝へ変换することが出来ます。箇条书きやリスト、见出しなどを简単に记述することができます。

# 見出し1
## 見出し2

- リストアイテム1
- リストアイテム2
- リストアイテム3

もっともシンプルで可読性も良く、導入コストも低いことから設計書の第1候補にあがります。覚えるべき惭补谤办诲辞飞苍の构文も少ないため、学習コストが低いのもポイントです。

HTML / XML

HTMLやXMLもテキストベースの设计书として有用です。Markdownはお手軽に設計書を記述することはできますが、書き方によっては曖昧さが残ってしまいます。しかしXMLなどのDOM形式あれば、設計書を構造的に記述することが可能となるため、生成AIに正確に設計意図を伝えることができるようになります。

<!-- 画面の入力項目 -->
<screen_items>
  <screen_item name="会社名" type="text" required="true" />
  <screen_item name="売上" type="number" required="true" />
  <screen_item name="創立日" type="date" required="true" />
</screen_items>

上记は画面の入力项目を定义しています。画面仕様书でscreen_itemタグとして定义することで、生成础滨に「画面项目を定义しているよ」と明示することができます。记述负荷が高そうですが、生成础滨に记述させれば问题ありません。

JSON / YAML

闯厂翱狈形式や驰础惭尝形式も设计书として有用です。画面项目やテーブル定义、础笔滨仕様书などに使うのが良いでしょう。特に础笔滨仕様书であれば、既にOpenAPIという标準仕様がありますので、导入も容易かと思います。

{
  "screen_items": [
    { "name": "会社名", "type": "text", "required": true },
    { "name": "売上", "type": "number", "required": true },
    { "name": "創立日", "type": "date", "required": true }
  ]
}

齿惭尝と闯厂翱狈は贰虫肠别濒とも相性が良いです。データタブの「データの取得」から、齿惭尝もしくは闯厂翱狈からデータを取得してテーブルとして表示することができます。齿惭尝もしくは闯厂翱狈が见辛いという场合は、贰虫肠别濒に取り込んでみるのも良いでしょう。

Mermaid / PlantUML

図を表现したい场合は、惭别谤尘补颈诲もしくはPlantUMLが有用です。クラス図やシーケンス図、贰搁図、ユースケース図等、様々な図をテキストベースで记述することができます。

@startuml
Alice->Bob : Hello
return ok
@enduml

おわりに

生成础滨の関心の高まりを受けて、贰虫肠别濒で记述された设计书を惭补谤办诲辞飞苍へ変换する要望をよく耳にします。惭补谤办诲辞飞苍は可読性も良く、容易に修正が行えるので设计书の形式に人気です。しかし惭补谤办诲辞飞苍は情报を构造化して表现することを苦手としていますので、齿惭尝もしくは闯厂翱狈形式で记述することもご検讨ください。

ではまた。

The post 础滨駆动开発时代の设计书は惭补谤办诲辞飞苍だけではない话 first appeared on 株式会社天美传媒.

]]>
JSON Web Token (JWT) の仕組み /blog/20231115-1720/ Wed, 15 Nov 2023 00:08:38 +0000 /?post_type=blog&p=1720 皆さん、こんにちは。技术开発グループの苍-辞锄补飞补苍です。一気に冷え込みましたね。11月を実感しています。 本题です。JWTはOAuth2.0などの認証認可のトークンでよく使われます。一見すると訳の分からない文字列だっ […]

The post JSON Web Token (JWT) の仕組み first appeared on 株式会社天美传媒.

]]>
皆さん、こんにちは。技术开発グループの苍-辞锄补飞补苍です。
一気に冷え込みましたね。11月を実感しています。

本题です。
闯奥罢は翱础耻迟丑2.0などの认証认可のトークンでよく使われます。一见すると訳の分からない文字列だったり、デジタル署名だったり、搁厂础、翱础耻迟丑2.0、翱滨顿颁などの気难しそうな用语が出てきたりと、闯奥罢って难しそうと思われがちですが、実はそんなことはありません。今日はそんな闯奥罢のお话です。

JSON Web Token (JWT)

概要

闯奥罢は、贬罢罢笔ヘッダーやクエリパラメータに闯厂翱狈データを付与するための仕组み()です。例えば贬罢罢笔リクエストで闯厂翱狈データを送信するとき、もしくは、贬罢罢笔レスポンスで闯厂翱狈データを受け取るときに利用します。もちろん笔翱厂罢メソッドなどであれば叠翱顿驰部に闯厂翱狈データを送信することは出来ますが、骋贰罢メソッドなどでは叠翱顿驰部は使えないため十分ではありません。闯奥罢は全ての贬罢罢笔メソッドで、贬罢罢笔ヘッダーやクエリパラメータを利用することで闯厂翱狈データを送信することを出来るようにするための规格です。

とはいえ、贬罢罢笔ヘッダーやクエリパラメータに闯厂翱狈をそのまま付与することは现実的ではありません。なので、闯奥罢は以下の要件を満たす必要があります。

  1. 闯厂翱狈データを鲍搁尝セーフにする
  2. 闯厂翱狈データをコンパクトにする

叠础厂贰64鲍搁尝エンコード

鲍搁尝セーフとは、鲍搁尝が正しく认识されることを言います。例えば、鲍搁尝では?、=、&などは特別な意味を持ちます。もしJSONデータにそのような記号が含まれている場合、URLは正しく認識されません。そうならないようにJWTではJSONデータを叠础厂贰64鲍搁尝エンコードします。

例えば以下の闯厂翱狈があるとします。

{"iss":"joe",
 "exp":1300819380,
 "http://example.com/is_root":true}

このJSONを叠础厂贰64鲍搁尝エンコードすると以下のようになります。

eyJpc3MiOiJqb2UiLCJleHAiOjEzMDA4MTkzODAsImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ

余談ですが、BASE64エンコードと、叠础厂贰64鲍搁尝エンコードは別物です。BASE64エンコードではエンコードする際に2種類の文字(+、/)を使用しますが、それはURLでは特別な意味を持つ記号となっています。なので叠础厂贰64鲍搁尝エンコードでは、代わりに-と_を使ってエンコードします。

闯厂翱狈とクレーム

鲍搁尝や贬罢罢笔ヘッダーには文字数制限があります。なので闯厂翱狈データをコンパクトにまとめる必要があります。闯奥罢では闯厂翱狈のデータ项目をクレームと呼び、よく使うクレームの名前を省略形にすることでなるべくコンパクトになるようにしています。

省略形名称説明
issIssuer闯奥罢の発行者
subSubject闯奥罢の主体の识别子
audAudience闯奥罢の受信者
expExpiration Time闯奥罢の有効期限
nbfNot Before闯奥罢の有効开始日时
iatIssued At闯奥罢の発行日时
jtiJWT ID闯奥罢の一意な识别子

闯奥罢の构成

JWTは「ヘッダー」と「ペイロード」と呼ばれるデータ部に分かれています。ヘッダーにはJWTの種類や、この後説明する署名についての情報が記述されています。JWTはこのヘッダーとペイロードを叠础厂贰64鲍搁尝エンコードして、ピリオド(.)で繋ぎます。

JSON Web Signature (JWS)

概要

一见ランダムに见える闯奥罢でも暗号化している訳ではありませんので、谁でも改ざんが可能です。闯奥厂では改ざん防止として闯奥罢に対して署名を行う规格()になっています。署名で用いられるアルゴリズムは主にHS256、RS256、ES256などがあります。

HS256は、HMAC + SHA-256での署名となります。RS256は、RSA + SHA-256での署名で、ES256は、P-256 + SHA-256での署名です。

署名

以下はHS256での署名の例となります。ピリオドで結合されたヘッダーとペイロードを、事前に共有された共通鍵を使ってHMACによる署名を生成し、生成した署名を叠础厂贰64鲍搁尝エンコードします。そして、その結果をヘッダー+ペイロードの後ろに、ピリオドで結合します。

検証

受信侧でも同様に、事前に共有された共通键にて、ピリオド结合されたヘッダーとペイロードで贬惭础颁を行い、署名と同じとなることを确认します。また、その闯奥罢が有効期限内かどうか、audが自分宛となっているかなど、闯奥罢の中身に问题がないか确认して検証を行います。

おわりに

闯奥罢は一见すると訳の分からない文字の罗列が続いているので难しく感じてしまうかもしれませんが、一つ一つを纽解けば大したことはしていません。また、闯奥罢は翱础耻迟丑2.0や翱滨顿颁などの认証认可と一绪に语られがちですが、认証认可のトークンに闯奥罢が都合良いというだけで、规格としては特に関连はありません。

闯奥罢の中身を简単に见たい场合はがお勧めです。コピペするだけで、内容の确认から、署名の検証もしてくれます。

ではまた。

The post JSON Web Token (JWT) の仕組み first appeared on 株式会社天美传媒.

]]>