よっぴブログ

【技術書メモ7】Webを支える技術

f:id:yoppi-y:20190526142246p:plain

 
 

第1章 Webとは何か

・HTTP、URI、HTML
Webを支える最も基本的な技術はHTTP、URI、HTMLである。
URI⇨ショッピングサイトの商品でも、学術論文でも、あらゆる情報を指し示せる
HTML⇨上記の情報を表現する文書フォーマット
HTTP⇨プロトコル。上記の情報を取得したり発注したりする。
 

第2章 Webの歴史

・Webの成功の一因は、必要最低限のリンク機能だけを備えていたから。逆にWeb以前のハイパーメディアの問題点は、その複雑さにあった。
 
・オープンで不特定多数を相手にするのがWeb。各ユーザーのコンピュータ環境は特定のOSやハードウェアには統一されておらず、様々なブラウザやデバイスから1つのWebサービスにアクセスできる。これは、クライアントとサーバ間のインターフェースをHTTPというシンプルなプロトコルで固定したことで実現できている。
 
・RESTが普及していくのと並行して、Webはインターネット全体を飲み込み始める。以前の地図ソフトでは、地図をローカルのハードディスクにインストールして利用していたが、この方法では1台のPCにインストールできるだけのデータしか扱えない。しかし、現在の地図サービスでは、全世界の衛星写真と地図をいつでも最新の状態で利用できる。これは、サーバ側で地図を保管し、必要に応じてダウンロードしているので、実現できている。
 

第3章 REST  WEBのアーキテクチャスタイル

・RESTはWebのアーキテクチャスタイル。システムは具体的なアーキテクチャを持っている。そのアーキテクチャを設計するときに、ただ闇雲に作っていくのではなく、アーキテクチャ設計の指針、作法、流儀、つまり、アーキテクチャスタイルを適用する。システムのアーキテクチャを決定する際の羅針盤となるのがアーキテクチャスタイル。
 
ソフトウェアを設計するにあたり、最も必要であるのが機能や性能の全体像と製品本体の構成要素のバランス。「ソフトウェアアーキテクチャ」はそれぞれの役割を関係性を考慮しながら、ソフトウェアを設計していくより良いスタイルを指している。
 
・リソース
RESTにおける重要な概念の1つにリソースがある。
リソースとはWeb上に存在する情報
世界中の無数のリソースはそれぞれURIで一意の名前を持つ
URIを用いることでプログラムはリソースが表現する情報にアクセスできる
 

第4章 URIの仕様

・ベースURIを明示的に指定する方法
WebページをHTMLとして保存した時に、そのHTMLファイルがもともとどのURIだったのかは通常わからない。この問題を解決するために、<head>要素の中に<base>要素を入れる。
<!このHTML文書内のベースURIhttp://example.jp/になる><basehref="http://example.jp/"/>
 
URIの長さ制限
使用上はURIの長さに制限はないが、実装上は制限が存在する。特に、にInternetExplorerはバージョンを問わず2,038バイトまでという制限があり、事実上この長さに合わせて実装することが多くなる。
 
URIの実装で気をつけること
クライアントで相対URIを解決するには面倒な処理が必要になるので、なるべく絶対URIを使っと方がクライアントに親切。
また、文字エンコーディングの混乱を避けるために、%エンコーディングの文字エンコーディングとしてなるべくUTF8を用いる。
 

第5章 URIの設計

URIを変わりにくくするために、プログラミング言語に依存した拡張子やパスを含めない。
URIはリソースを表現する名詞にする
URIを変更したい時
どうしてもURIを変更したいときは、できる限りリダイレクトをするようにする。
 

第6章 HTTPの基本

・クライアントとサーバ
HTTPではクライアントが出したリクエストをサーバで処理してレスポンスを返す。このようなプロトコルのことをリクエスト/レスポンス型と呼ぶ。
サーバでの処理に時間がかかる場合でも、リクエストを出したクライアントはレスポンスが返るまで待機する。これはHTTPが同期型のプロトコルだから。
 
・HTTPメッセージ
リクエストメッセージとレスポンスメッセージをまとめて「HTTPメッセージ」と呼ぶ。
 
・ステートレスの利点
ステートレスでは、クライアントがリクエストメッセージに必要な情報をすべて含める。
ステートレスなサーバはアプリケーション状態を覚える必要がないため、サーバ側のシステムは単純になる。
 
・ステートレスの欠点
パフォーマンスの低下
送信するデータ量が多くなる
認証など、サーバに負担がかかる処理を繰り返す
通信エラーへの対処
ステートレスなアーキテクチャでは、ネットワークトラブルが起きた時にそのリクエストが処理されたかどうかがわからない。
 

第7章 HTTPメソッド

・POST
POSTには3つの役割がある。
子リソースの作成
リソースへのデータの追加
他のメソッドでは対応できない処理
 
・べき等性と安全性
べき等性⇨ある操作を何回行っても結果が同じこと
安全⇨操作対象のリソースの状態を変化させないこと
 
・安全でもべき等性でもないPOST
POSTはリクエストの結果で何が起こるかわからない。クライアントはPOSTを複数回送ることに慎重でなければならない。
 

第8章 ステータスコード

ステータスコードの分類と意味
1xx:処理中
2xx:成功
3xx:リダイレクト
4xx:クライアントエラー
5xx:サーバエラー
 
・よく使われるステータスコード
200 OK   リクエスト成功
301 Moved Permanently   リソースの恒久的な移動
400 Bad Request   リクエストの間違い
 

第9章 HTTPヘッダ

・認証
あるリソースにアクセス制限がかかっている場合、ステータスコード401 UnauthorizedとWWWAuthenticateヘッダを利用して、クライアントにリソースへのアクセスに必要な認証情報を通知できる。
 
ユーザ名とパスワードによる認証方式。ユーザ名とパスワードをAuthorizationヘッダに入れてリクエストごとに送信する。Authorizationヘッダの内容は、認証方式に続けてBase64エンコードした文字列になる。
Base64エンコードした文字列は簡単にデコード可能である。すなわち、ユーザ名パスワードが平文でネットワーク上を流れていることを意味する。Basic認証を使う場合は、それが許される程度のセキュリティコードで良いのかを検討しなければならない。
 
・Digest認証
Basic認証よりもセキュアな認証方式。パスワードを盗まれる危険性はない。また、サーバ上にパスワードのハッシュ値を保管しておけば良いので、パスワードそのものをサーバに預けなくてもよくなる。
ただし、パスワードを暗号化するだけなので、メッセージ自体は平文でネットワーク上を流れる。メッセージを暗号化したいときはHTTPSを利用する。
 
・キャッシュ
サーバから取得したリソースをローカルストレージに蓄積し、再利用する手法のこと。
 

第10章 HTML

・フォーム
フォームはターゲットとなるURIを待つ。
その時に用いるメソッドは<form>要素のmethod属性で指定する。この属性の値はGETまたはPOSTになる。
 
・ハイパーメディアとしてのHTML
HTTPとURI、そしてハイパーメディアによるリンクの組み合わせで初めてwebが成り立つ。HTMLでリンクを設計する際は「リンクをたどることでアプリケーションの状態が遷移する」ことを強く意識する。
 

第11章 microformats

HTMLの中でさらに意味のあるデータを表現するための技術がmicroformatsである。
 
microformatsの標準化
microformatsはHTML文書そのものにメタデータを埋め込む技術である。microformatsは「より簡単に、もっと気軽にwebページのセマンティクスを記述できるようにしよう」という目的のもと、様々なメタデータ記述の仕様を策定している。
 
・リソース表現としてのmicroformats
microformatsを用いると、既存のwebサービスをそのままWeb APIとして提供できる。両者に機能差が出ることはない。
 

第12章 Atom

AtomSyndicationFormatは、RFC4287が規定するXMLフォーマットである。
Atomはタイトル、著者、更新日時といった基本的なメタデータを備えたリソース表現のためのフォーマットである。
 

第13章 AtomPublishingProtocol

このプロトコルを採用すると、ブラウザ以外のWebクライアントからブログを投稿したり、システム同士を連携したりといったことが簡単にできるようになる。
 

第14章 JSON

JSONとは何か
JavaScriotの記法でデータを記述できるのが最大の特徴。
 
・クロスドメイン通信の制限
複数のドメインサーバと通信できず、単一のドメインのみと通信をしなければならないのは大きな制限。例えば、自サービスでは地図データと郵便番号データを保持せずに、それらを提供している他のWeb APIから適宜取得することができないから。
 
・<script>要素による解決法
HTMLの<acript>要素を用いると、複数のサイトからJavaScriptファイルを読み込める。
 
・コールバック関数を活用するJSONP
JSONPは、ブラウザの子の性質を利用してクロスドメイン通信を実現する手法。JSONPではオリジナルのJSONをクライアントが指定したコールバックを関数名でラップして、ドメインの異なるサーバからデータを取得する。
 

第15章 読み取り専用のWebサービスの設計

・リソース設計とは何か
リソース設計とは、クライアントとサーバ間のインターフェースの設計、つまりWebサービスやWeb APIの外部設計。
リソースを設計する際には、WebサービスとWeb APIを分けて考えないことが大切。
 

第16章 書き込み可能なWebサービスの設計

・書き込み可能なWebサービスの難しさ
読み取り専用のWebサービスに比べると、考えなくてはいけないことがたくさんある。
たとえば、複数のユーザが同時に書き込みをしたらどうなるのか、複数の処理手順を実行するにはどうしたらいいか、など。
 
・リソースの削除
一般的には、親リソースに従属する子リソースは、親リソースの削除に伴って削除するべき。例えば、ブログエントリを削除した場合、そこに付随するコメント群を削除するのが一般的。
 
大量の郵便番号を作成したり更新したりする場合は、リクエストを一回一回送信すると、サーバへの接続回数が多くなり、パフォーマンスが問題になることがある。このようなときは、作成、更新したいリソースを一括で送信(バッチ処理)できるようにWebサービスを実装する。
 
バッチ処理のレスポンス
問題になるのが、エラーが起きた時の対処方法。エラーが起きた時の対処法としては2つある。
1つめは、バッチ処理トランザクション化して途中で失敗した場合は、何もしないことをWebサービスで保証すること。
2つめは、どのリソースの処理が成功して、どのリソースの処理が失敗したのかをクライアントに伝えること。