コンテンツにスキップ

Web

「トークン」とはなにか

半年以上前のある夜、大先輩エンジニアの方に隠れ家的なオシャレな大人のBarに連れて行っていただきました。

その日はそれまでに既に結構飲んでいまして、本当に恥ずかしながらそこでお話した内容のほとんどは覚えていないのですが、一つだけ鮮明に覚えているのは、

** 「トークン」ってなに? **

と私に説明を求められたことです。なにかを答えはしたのですが、かなり曖昧な答えになっていたと思います。

さらに最悪なのは、その後その大先輩が語られた内容を覚えていないことです。これは最悪です。次の日に「トークンって結局なんでしたっけ?」などとも聞けないのでそれ以来いろいろ考えてきたことを書きます。

トークンとはなにか

Webの開発をしているとしばしばトークンというものが登場します

  • Access Token
  • ID Token
  • JWT(JSON Web Token)
  • etc...

このトークンとはなにか、という話です

そもそもトークンなんて日本語はないのだから、トークンはトークン、という感じなのですが、あえて日本語にすると

** 「証」(しょう) **

という漢字一文字が合うのかな、と思います。

  • 通行証
  • 身分証
  • 免許証
  • etc...

トークンの性質

これらに共通するのは

  • 誰かが発行し
  • 何かが書いてある

ということではないでしょうか

特に「何かが書いてある」、という部分は様々な内容を持ち得ます

  • 通行証には、ある場所を通ること、ある場所に到達することを許可する旨が書かれています
  • 身分証には、それを持っている人が誰なのか、それを示す内容が書かれています
  • 免許証には、誰に何をすることを許可するのかが書かれています

このように考えると「トークン」という言葉がしっくりくるのでは、と現在思っております。

RESTとはなにか

APIを実装することになり、今更ながらWebのアーキテクチャスタイルであるRESTとはなにか理解するためにまとめてみた。

Webのアーキテクチャスタイル

Webのアーキテクチャスタイルはクライアント/サーバーというスタイルを中心に、いくつかの制限(アーキテクチャ)を複合的に組み合わせたREST(Representational State Transfer)を理想としている

RESTはどのようなスタイルなのか

RESTは以下のスタイルを複合的に組み合わせたアーキテクチャである

  • クライアント/サーバー
  • ステートレスサーバー
  • キャッシュ
  • 統一インターフェース
  • 階層化システム
  • コードオンデマンド

クライアント/サーバー

WebではHTTPでクライアントとサーバーが通信する、クライアント/サーバーアーキテクチャを採用している。クライアントはサーバーにリクエストを送り、サーバーはそれに対してレスポンスを返す。

ユーザーインターフェースはクライアントに任せればよく、サーバーは処理に専念できるので様々なデバイス(PC・携帯電話・ゲーム機)に対応でき、サーバーの冗長化も容易である。

ステートレスサーバー

ステートフル/ステートレスという考え方があるが、サーバーがステートレスなやり取りを前提としていること。

ステートフル/ステートレスに関しては以下のエントリを参照

キャッシュ

一度取得したリソースをクライアント側である程度の期間保持して使い回すこと。

  • メリット
    • 同じリソースを取得するためにその都度クライアント/サーバー間で通信する必要がなくなる
    • これによりネットワークの帯域節約や処理の高速化を実現できる
  • デメリット
    • 適切に制御しないと意図せず古いリソースを参照してしまうことがある
    • 特に大規模なシステムではどこで何がキャッシュされているか正確に把握するのは容易ではない

統一インターフェース

リソースに対する操作を統一したインターフェースで行う。

HTTP/1.1ではリソースに対するメソッドが8つのみ定義されている。このようにインターフェースを限定することで様々なコンポーネントが生まれても統一された仕様としてリソースへの操作が行われ、それぞれの独立性が保たれることで多様性を受け入れることができる。

階層化システム

統一インターフェースを採用することにより、クライアント/サーバー間にプロキシなどのコンポーネントを設置してもクライアントはそのままリクエストを送ることができる。

これにより大規模システムではロードバランサーを導入したり、HTTPインターフェースを持たないコンポーネントに対してHTTPインターフェースをもつサーバーを返して処理をするなどの階層化が可能となる。

このようなアーキテクチャを階層化システムと呼ぶ。

コードオンデマンド

プログラムをサーバーからクライアントが受け取り、それをクライアント上で実行するアーキテクチャスタイル。JavaScriptやFlashがこれに該当する。

  • メリット
    • サーバーと都度通信することなくクライアント側のみで処理できることが増える
    • これによりユーザーのアクションに対する処理の速度が向上する
  • デメリット
    • クライアント/サーバー間でやり取りされるリソースが不明確になる
    • クライアント側の裁量が増える分、サーバーとやり取りされるリソースの内容が明確ではなくなる

RESTful

RESTの思想に忠実に設計されていることをRESTfulである、と言う。

RESTは上記の通り分散ネットワークを効率的に、可用性・冗長性高く利用するための理論であり、Webが理想とするアーキテクチャスタイルである。

この思想に則った設計がされることで多様なシステムの中にも仕様の統一感が生まれ、Webの世界が広がったと言える。

参考

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

ステートフル ステートレスとはどういうことか

コンポーネント間のやり取りにはステートフル/ステートレスという考え方がある。FTPではステートフルなやり取りが、HTTPではステートレスなやり取りが採用されいるが、それぞれの特徴についてまとめてみる。

セッション状態(アプリケーション状態)

システムにログインしてからログアウトするまでの一連の操作をセッションと呼ぶ。その一連の操作の中のそれぞれの状態をセッション状態と呼ぶ。

ステートフル

ステートフルなやり取りではサーバーはクライアントのセッション状態を保持している。

  • メリット
    • やり取りが完結に済む
    • それによりネットワークの帯域を節約できる
  • デメリット
    • クライアントの状態を都度把握しておかなければいけないのでクライアントが増えると負荷も増える
    • サーバーを複数台設置する場合にはそれぞれのサーバー間でクライアントの状態を同期しなければいけない
    • これらの理由によりスケールアウトには向かない

ステートレス

ステートレスなやり取りではサーバーはクライアントのセッション情報を保持しない。

  • メリット
    • クライアントのリクエストは状態に依存せず、常にリソースに対する操作に必要十分な情報となる
    • よってサーバーが増えてもそのままのリクエストでいつも同じリソースに対する操作ができる
    • このためスケールアウトに向いている
    • また処理がクライアントの状態に依らないので処理がシンプルになる
  • デメリット
    • やり取りが冗長になりがちである
    • またリソースへの操作が必要になる度にそのやり取りを繰り返す必要がある
    • これによりネットワークの帯域を消費し、処理も遅くなる
    • サーバーが状態を保持していないのでエラーが起きたときのハンドリングが複雑になりがちである

参考

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)