Real World HTTP の読書感想文

tl;dr

オライリーのReal World HTTPを読みました

全11章で構成されていて、HTTPの歴史に沿ってHTTPの機能やwebの世界でよく使われる技術 (暗号化、レスポンシブデザインなど)を紹介しています

HTTP/1.0のメインの機能とHTTP/1.1、HTTTP/2.0に変わる際に何が変わったのかについて詳しく説明してあり、実際にgoを使ってHTTPサーバーとクライアントを用意しHTTP通信を行うハンズオンも用意してあるため理解はしやすかったです

ただ本の構成としてはコア機能として4つありますと言いつつ、順番に紹介するわけではなく追加でいくつか機能が書かれていて読みにくさは感じました

ブラウザからリクエストを送った時何が起こっているのか、体系的にHTTPについて勉強したいのであれば網羅的に書いてあるのでいいと思います

読んだ本

www.oreilly.co.jp

Amazon CAPTCHA

普段Webエンジニアとして仕事をしているくせに、HTTPについてきちんと理解しているかと言わたら自信を持ってyesとは言えないなと思って勉強の為に読みました

1章

HTTP/1.0の基本の4つの要素

メソッドとパス

HTTPリクエストを送る時にはメソッドとpathを指定します

メソッドは以下のようなもの

  • GET: サーバーに対して、ヘッダーとコンテンツを要求
  • HEAD: サーバーに対して、ヘッダーのみを要求
  • POST: 新しいドキュメントを投稿

パスはサーバーの中のどのファイルをリクエストしたか示すものです

/index の時はリクエストを受け取ったサーバーのrootディレクトリ直下のindexというファイルを要求しています

ヘッダー

ヘッダーはリクエストヘッダーとレスポンスヘッダーの2種類があります

リクエストヘッダーはブラウザからサーバーへ送るリクエストに含まれるヘッダーで先ほどのメソッドとパスの他に、host (どこのサーバーへ送るか)、User-Agent (リクエスト送信元のブラウザの種類)などが記載されています

レスポンスヘッダーはサーバーからブラウザへ送るレスポンスに含まれるヘッダーで、3桁のステータスコード、Content-Length (レスポンスのサイズ)、Content-Type (送られてきたレスポンスのファイルの種類)が記載されています

ボディ

ヘッダーの下に1行空行を挟み、それ以下は全てボディと見なされる

リクエストにもレスポンスにもボディを含むことができる

ちなみにGETリクエストにもボディを含むことができるが、サーバー側で無視される

ステータスコード

レスポンスヘッダーに含まれる3桁の数字

ステータスコードの大まかな分類

  • 100番台: 処理中の情報の伝達
  • 200番台: 成功時のレスポンス
  • 300番台: サーバーからクライアントへの命令。リダイレクトやキャッシュの利用を支持
  • 400番台: クライアントから送られたリクエストにおかしなことがある場合のレスポンス
  • 500番台: サーバー内部でエラーが発生した場合のレスポンス

1章の感想

HTTP/0.9では何ができてHTTP/1.0ではどう変わったのかという流れで進めながらHTTPの基本を紹介しています

冒頭で基本の4要素として

を紹介しているわりに、それぞれについて詳しく説明するみたいな構成ではないので読みづらかったです

第2章

フォームの送信方式

x-www-form-urlencoded

keyとvalueの組み合わせをencodeして送信する

テキストのみ

multipart/form-data

ファイルの送信が可能

区切り文字ごとにファイルなのか文字列なのかContent-Type (正確にはContent-Disposition)を指定

クッキー

サーバーがブラウザにデータを保存しておく仕組み

クライアント側で削除や変更が可能なので永続的である必要のあるデータの保存には向かない

セッショントークンの保存などに用いられる

セッション

サーバー側で認証が済んだ後に、トークンを発行してその後の認証はidとpasswordを使わない仕組み

クッキーに含まれるトークンとセッションサーバーに保存されたトークンで認証する

プロキシ

ブラウザとサーバーの仲介役となるサーバー

cssやjsなどの静的ファイルをプロキシサーバーから返すことでレスポンスを早くすることができる

キャッシュ

ブラウザ側ですでにダウンロード済みのコンテンツがありダウンロード後変更がなければ、サーバーから再ダウンロードすることなくページを表示する仕組み

Headerによって時間などを細かく制御可能

2章の感想

フォームの送信、クッキーやセッションの話など普段ブラウザとサーバーとの通信で使われているものの紹介

この章は一つ一つ丁寧な説明があって、例えばmultipart/form-dataの構造はどうなっているかとか

キャッシュのコントロールはどのように行われているかなど詳細に書いてあってわかりやすかったです

3章

ハンズオンのため省略

4章

HTTP/1.0からHTTP/1.1への変更点

  • 通信の高速化
  • TLSによる暗号化通信のサポート
  • 新メソッドの追加
  • プロトコルのアップグレード
  • 名前を使ったバーチャルホストのサポート
  • サイズが事前にわからないコンテンツのチャンク転送エンコーディングのサポート

通信の高速化

以下の二つの仕組みを使って高速化されている

Keep-Alive

TCP/IPの通信を高速化する仕組み

Keep-Aliveを使わない場合は一つのリクエストごとに通信を閉じる

Keep-Aliveを使う場合、リクエストヘッダーに以下のヘッダーが追加される

Connection: Keep-Alive

そしてクライアントとサーバーのどちらが以下のヘッダーを付与して接続を切るかタイムアウトするまで接続を継続する

Connection: Close

クライアントとサーバーとの間で連続で通信を行う際に毎度コネクションを貼らなくていいので通信を高速化することができる

パイプライニング

HTTP/1.0ではクライアントがリクエストを送りサーバーからレスポンスが返ってくるのを待ってから次のリクエストを送っていた

パイプライニングは最初のリクエストが完了する前に次のリクエストを送信し、「レスポンスが返ってくるまで次のリクエストを待つ」この時間を短縮する

TLS

通信を暗号化する仕組み

共通鍵方式と暗号鍵方式の両方を使用して通信を暗号化する

具体的にはクライアント側で共通鍵を作成し、公開鍵で暗号化する

それをサーバー側で秘密鍵で復号し、その後の通信は共通鍵で暗号化して行う

公開鍵の安全性の高さと共通鍵の暗号、復号にかかる時間の短さの両方の良さを活かしている

PUTメソッドとDELETEメソッドの標準化

HTTP/1.0ではオプションだったPUTとDELETEが標準化されることでデータを扱う基本の4メソッド (CRUD: Create, Read, Update, Delete)が揃った

プロトコルのアップグレード

HTTP以外へのプロトコルへのアップグレードができるようになった

  • HTTPからTLSを使った安全な通信へのアップグレード

  • HTTPからWebSocketを使った双方向通信へのアップグレード

  • HTTPからHTTP/2へのアップグレード

バーチャルホストのサポート

ドメイン名 + ポート番号をサーバーが受け取れるようになり、一台のウェブサーバーで複数のウェブサービスを運用できるようになった

チャンク

いわゆるストリーミング方式と呼ばれる、全体を一括で送信するのではなく、データを小分けにして送信するチャンク方式がサポートされた

4章の感想

この章ではかなりページを割いてTLSについて解説されていました

hash化、SSLサーバ証明書、鍵交換アルゴリズムなど一つ一つわかりやすく説明してあったのでまた別の記事で自分なりに整理して書きたいと思います

第1章とかに比べてかなり読みやすかったです

5章

この章ではHTTP/1.1以降に追加された様々な機能について紹介されています

ファイルのダウンロード

ブラウザがファイルをどのように処理するかは、ファイルの拡張子ではなくサーバの送るMIMEタイプで判断されます

以下のようなヘッダーが含まれる場合、ブラウザはfilenameで指定された名前でファイルを保存します

Content-Disposition: attachment; filename=filename.xlsx

Content-Dispositionヘッダーによるダウンロードの仕組みはHTTP/1.1の初版から2年後のRFC2616で言及されました

ダウンロードの中断、再開

HTTP/1.1ではダウンロードが中断した時に、途中から再開する方法が提供されています

サーバー側が範囲指定ダウンロードをサポートしている場合、Accept-Rangesヘッダーを付与することで範囲指定が可能です

Accept-Ranges: bytes

複数範囲を指定することもできます

Accept-Ranges: bytes=100-399, 500-799

これを使うとContent-Type=multipart/byterangesというヘッダーが含まれたレスポンスが返ってきます

multipart/form-dataがリクエストに複数のデータを含めるのに使われるのに対し、multipart/byterangesはレスポンスに複数のデータを含めるのに使用されます

XMLHttpRequest

XMLHttpRequestJavaScriptから使用できるcurlコマンドのようなもので、JavaScriptからサーバーへリクエストを送ることができます

ブラウザ - サーバー間でリクエストを送ると、レスポンスが返ってきた時点でブラウザがリロードされてしまいますが、JavaScript - サーバー間でリクエストを送るとリロードすることなく新たなデータをサーバーから取得することができます

この機能を使い、画面クリアせずにウェブページを読み込んだり、時間やタイミングをずらしてなんども更新できるアーキテクチャのことをAjax (Asynchronous JavaScript + XML)と呼びます

Geo-Location

通信してきたクライアントの物理的な場所を測定する方法

以下の2パターンがあります

クライアント自身が場所を得る情報

スマートフォンであればGPS情報を使って位置情報を返すことができます

またWifiのアクセスポイントとユニークなIDを保存しているサーバーにクライアントからリクエストを投げることで位置情報を知ることもできます

サーバーがクライアントの場所を推測する方法

これはGeoIPと呼ばれ、IPアドレスから推測します

IPアドレスは地域ごとに管理団体があり、企業やプロバイダーに割り当てを行います

どのプロバイダーがどのアドレスどこへを割り当てているかはわからないため、地道にデータを集めてマッピングしたサービスを使用することになります

X-Powerd-Byヘッダー

RFCの規格にはない独自ヘッダー

多くのサーバーがシステム名を返すのに使用しており、デファクトスタンダードになっています

ただ、セキュリティの面でサービスの脆弱性を晒すことになりかねないので、OSバージョンなどサーバー名以外の余計な情報は入れてはいけないと決められています

リモートプロシージャコール

別のコンピュータの機能を、あたかも自分のコンピュータ内であるかのように呼び出しを行い、必要に応じて返り値を受け取る仕組み

XML-RPCSOAPJSON-RPCと行った規格がある

WebDAV

WebDAVは正確にはHTTP/1.1には含まれていません

HTTP/1.1を拡張することで分散ファイルシステムとして使えるようにしたものです

HTTP/1.1のPOST、GET、PUT、DELETEだけではファイルシステムとして機能が足りないので以下のようなメソッドを追加しています

COPY、MOVE、MKCOL (ディレクトリ作成)、PROPFIND (要素一覧をプロパティとして取得)、LOCK/UNLOCK (複数人の編集によるデータの不整合を防ぐ)

ウェブサイト間で共通の認証、認可プラットフォーム

様々なWebサービスが登場するにつれ、サービスごとにID/Passwordを作成、保管することがユーザーにとって負担となってきました

そこで外部の認証基盤に相乗りする仕組みが開発されてきました

サービス側としても認証基盤を一から実装しなくて済みますし、ユーザーも新たにpasswordを覚えなくてすみます

以下が代表的な例です

5章の感想

かなりの重量感のある章でしたw

ただ紹介されているるのは現在多く使われている技術がメインなので面白く読むことができました

恥ずかしながら名前は知ってたけどJSからサーバーへの通信=XMLなのはわかってなかったなあ

6章

ハンズオンのため省略

7章

この章ではHTTP/2とその他の新しい世代のプロトコルについて紹介されています

HTTP/2

HTTP/1.1からHTTP/2の大きなアップデートは以下の3つです

  • ストリームを使ってバイナリデータを多重に送受信する仕組みに変更
  • ストリーム内での優先順位設定や、サーバーサイドからデータ通信を行うサーバーサイドプッシュを実装
  • ヘッダーの圧縮

HTTP/2の目的は通信の高速化です

HTTP/1.1とは完全に異なったプロトコルであるため、TLS内に作られたプロトコル選択機能を使い丸ごと通信方式を切り替えます

そのため後方互換性の問題が起きにくくなっています

ストリーム

HTTP/2では各データはフレームと呼ばれる単位で送受信が行われます

HTTP/1.1までは1つのリクエストがTCPのソケットを占有してしまうため、2−6本のTCP接続を行なって並列化していました

HTTP/2では1本のTCP接続の内部にストリームという仮想のTCPソケットを作って通信を行います

ストリームがないときは新しいTCP説僕を行うたびにサーバーとクライアントでハンドシェイクを行い、並列化を行なっていました

ストリームを使うことで、ハンドシェイクなしに簡単に接続の並列化を行うことができるようになりました

サーバープッシュ

優先度の高いコンテンツをクライアントからリクエストされる前に送信できる仕組み

ただ双方向通信ではないので、あくまでクライアントがリクエストを送信するまではデータがプッシュされていることは検知できません

コンテンツを事前にキャッシュしておき、リクエストを送るタイミングですぐにダウンロードできるという仕組みです

ヘッダーの圧縮

HTTP/2ではヘッダーを圧縮できます

ヘッダーの圧縮で使用されるHPACKという方式は、事前に辞書を持っておきます

HTTPのヘッダーは同じ名前がよく出現するためヘッダー名とヘッダー値をあらかじめ辞書に持っています

Fetch API

XMLHttpRequestのようなJavascriptから用いるサーバーアクセスを行う関数

JavascriptのPromiseに準拠しています

キャッシュの制御やリダイレクトの制御を行うことができ、またPWAのライフサイクルや通信内容をコントロールするService Workerの中からも利用することができます

Server-Sent Events

一度のリクエストに対して、サーバーから複数のイベント送信を行う機能

Chunked形式で送信し、クライアント側ではJavascriptがイベントをlistenします

Web Socket

クライアントとサーバの間でオーバーヘッドの小さい双方向通信を実現する機能

1対1の通信のため送信先の情報などは持っていません

HTTPとは違い、サーバーのメモリ上にデータを持った状態で通信するステートフルな通信であるため普通のロードバランサーは使えないので注意が必要です

Web RTC

Web RTC (Web Real-Time Communication)とはブラウザとサーバーではなく、ブラウザとブラウザの通信で使われる基盤です

基本的にはビデオ通話や画面共有などに使われ速くデータを届けることが必要になるため、TCPではなくエラー処理や再送処理を行わないUDPをメインで使います

TCPUDPの違いについては以下のリンクの記事でまとめています

zwzw.hatenablog.com

HTTP ウェブプッシュ

ウェブサイトにスマートフォンアプリケーションのような通知機能を提供する仕組み

プッシュサービスはChromeFireFoxが対応しています

流れとしては

  • ブラウザがpushサービスに購読を申し込む
  • アプリケーションサーバーがプッシュサービスにメッセージを投稿
  • ブラウザがプッシュメーセージを受信

となります

実際にメッセージを受信するのはService Workerです

7章の感想

HTTP/2以外の機能がバラエティーに富んでいて一度で理解するのはしんどいなと思いました 特にRTCの部分はめちゃめちゃ短くまとめちゃいましたが、色々なユースケースに対してどんどん新しい機能が追加されていて読んでて頭が追いつかなかったです ただ新しいプロトコルだけあって身の回りに使われているものが多くイメージはわきやすいと感じました

8章

8章ではブラウザとサーバーの通信の話ではなく、HTTP/2の登場前後で現れた検索エンジンソーシャルメディアが理解するプロトコルの紹介です

レスポンシブデザイン

昔はUser Agentをみてデザインを切り替えるだけで十分でした

近年はPCとスマホタブレットの縦と横などがあり、様々なデバイスで適切なレイアウトの表示を可能にするのがレスポンシブデザインです

cssのmedia queryを使用することでデバイスの幅にあわせてstyleを変更することができます

developer.mozilla.org

セマンティックウェブ

ウェブで表面的な「テキスト」「文書」だけでなく「意味」を扱おうという運動がセマンティックウェブです

セマンティックウェブもオープングラフプロトコルもAMPも人間向けの情報ではなく、他のシステムにウェブサイトのメタ情報を伝えるための機能です

RDF (Resource Description Framework)

XMLを使ってURIで識別されるエンティティ間の関係性を記述するものです

ウェブサイトの記述はHTMLなのでRDFを直接埋め込むことはできず、ベージ外にリソースをおきます

ダブリンコア

メタデータ記述のボキャブラリー集

大抵のウェブリソースは誰かの著作物であることが多いので著作権、著者、ID、出版社などの情報をメタデータとして埋め込むことができます

RSS

RSSはウェブサイトの更新履歴のサマリーに関するボキャブラリーです

ブログやウェブサイトを更新すると、ブログエンジンやコンテンツ管理システムが自動的に更新をしてくれ、RSSファイルに新しい順に新規コンテンツのサマリーが格納されます

ウェブサイトをブラウザで巡回しなくても、リーダーが登録したRSSの更新チェックを行い、未読のエントリーを集めて効率よく閲覧できるようにしてくれます

オープングラフプロトコル

twitterとかに記事を貼り付けると展開して画像や本文の一部を表示してくれる機能

f:id:poul8et6:20191228210043p:plain
はてなブログのリンクをツイッターに貼った場合こんな感じに展開される

ページ内にSNS向けの情報をメタタグとして記述する

以下の情報がよく使われる

  • タイトル

  • 種類

  • URL

  • 画像

  • 引用ページに貼り付けるテキスト

ちなみにTwitterにはオープングラフプロトコルを拡張したTwitterカードという仕組みが用いられている

AMP

モバイル高速化のための仕組み

AMPに準拠したモバイル用の軽いウェブページを作成することでレスポンスタイムを速くすることができます

また、検索エンジンが情報収集のために用いるプログラムであるクローラーがAMPであるコンテンツを発見すると、GoogleCDNサーバーにコンテンツをコピーします

ユーザーがモバイルでページにアクセスしようとした場合、GoogleCDNサーバーからコンテンツが配信されるため普通にサーバーからダウンロードするよりも高速にレスポンスを返すことができます

8章の感想

レスポンシブデザインはかなり身近な言葉なので割とわかっていましたが、オープングラフプロトコルは名前は全く知りませんでした

ただ蓋を開けてみるとSNSがこれだけ使われている現代で見ない日はない技術で、あーこういう風に表示されてたのかーという面白みがありました

Real World HTTPもずいぶん読み進めましたがやっぱり後半の方が身近な話が多くて頭に入って来やすいですねw

9章

ハンズオンのため省略

10章

この章ではブラウザのセキュリティについて説明されています

クロスサイトスクリプティング (XSS)への対策

クロスサイトスクリプティングとはユーザーが入力するフォームなどに悪質なスクリプトを入力する攻撃方法です

攻撃者がJavascriptなどのスクリプトを入力し、サービス側が何のフィルタリングもせずにそれをHTMLとして出力していると、ブラウザ上でスクリプトが実行されてしまいます

クロスサイトスクリプティングは他の攻撃の起点となり得ます

例えばクッキーにアクセスされると他のサーバーに送信されクッキー情報が漏洩しますし、セッショントークンが盗まれるとログインユーザーになりすまされてしまいます

対策としては以下のものがあります

ヘッダーにhttpOnly属性を付与する

これを行うとJavascriptからクッキーにアクセスできなくなるためクロスサイトスクリプティングによるクッキー漏洩を防ぐことができます

X-XSS-Protectionヘッダーを設定

X-XSS-Protectionヘッダーを使うとHTMLのインラインでスクリプトタグを使っているケースなど明らかに怪しいパターンを検出します

Content-Security-Policyヘッダーを設定

Content-Security-Policyヘッダーはウェブサイトで使える機能を細かくON/OFFできる仕組みです

例えばHTMLから読み込むリソースファイルのアクセス権を設定したりすることができます

Content-Security-Policyヘッダーは使用することでXSSに対する強力な防衛策となりますが、強すぎて正常な動作を妨害することもあります

段階的に移行していきたい場合はContent-Security-Policy-Report-Onlyヘッダーを使用することでチェックは行うが動作は止まらないという設定にすることができます

中間者攻撃 (MITM攻撃) への対策

中間者攻撃はプロキシサーバーが通信を中継するときに通信内容を抜き取られることで情報が漏洩してしまう問題です

中間者攻撃を避けるにはHTTPS (TLS)を使って、通信の内容を暗号化するしかありません

しかし、TLSが守るのはあくまで「通信経路」だけなのでサーバーに対するクラックやブラウザに対するXSSには注意が必要です

HSTS (HTTP Strict Transport Security)

HSTSは中間者攻撃に対するHTTPの仕組みの1つで、サーバー側から今後接続する場合はHTTPSで接続してくれと伝達する仕組みです

レスポンスヘッダーに Strict-Transport-Security というヘッダーと有効期限を指定して返します

ただ初回の通信はHTTPになってしまうのでGoogle Chromeではこのデータベースを最初から設定するため情報を集めています

ウェブサイトから申請しておくと最新のブラウザをダウンロードするだけで初回からHTTPS通信になります

HTTP公開鍵ピンニング

ブラウザ側で、初回にアクセスした際サーバーが送信してきた公開鍵を保存しておきます

2回目以降にサーバーが送ってきた証明書の公開鍵と手元で保存している公開鍵を照らし合わせ、サイトの証明書が不正に変更されていないことを検証します

セッションハイジャッキングへの対策

セッションハイジャッキングとはその名の通り、ウェブサービスのセッショントークンを盗み出し、ウェブサイトにログインする攻撃です

セッショントークンはクッキーに保存されブラウザからサーバーへ送信されるため、以下の方法でクッキーを漏洩しないようにするのが有効な手段です

クロスサイトリクエストフォージェリ (CSRF)への対策

クロスサイトリクエストフォージェリとは、本人の意図しないサーバーリクエストを、無関係のページやサイトから送らせる攻撃方法です

本人が意図せずともクッキーは発行されてしまうのでログイン状態となり、被害者の権限で操作の実行が可能になります

CSRF対策トーク

これはフォームを送信するときに、type: hiddenのinputタグにランダムなトークンを入力し、サーバー側で正しいトークンが含まれていないリクエストを拒否する仕組みです

ウェブアプリケーションフレームワークで提供されている仕組みをそのまま使用すればCSRF対策トークンが送信されるはずです

リスト型アカウントハッキングへの対策

脆弱なウェブサイトが不正侵入を受けて、ユーザーIDとパスワードが流出してしまい、同じメールアドレスとパスワードで他のサイトに登録していたユーザーの情報も漏洩してしまうというもの

もちろんサービスごとに異なるパスワードを使用するのが一番安全です

二要素認証

ID、パスワードに追加して本人しか知り得ないと期待されるコードを入力する認証方法

銀行のワンタイムパスワードGoogle Authenticatorなどのアプリケーションを用いる場合が多いです

10章の感想

セキュリティに関してはあまり理解できていないので、主要な攻撃方法を知れたのはよかった

XSSSQLインジェクションなどに実際に自分で対策をするとなると、この賞でも書かれてたけどやっぱりフレームワークのやり方に乗っ取るのが一番なんだろうなと思った

11章

この章ではRESTful APIについてブラウザの視点から説明されています

RESTful APIとは

REST (REpresentational State Transfer)は以下の特性を備えています

  • APIがウェブサーバーを通じて提供されている

  • GET /users/[ユーザーID]/repositriesのように、パスに対してメソッドを送ることでサービスを得る

  • APIの成功可否はステータスコードとしてクライアントに通知される

  • URLはリソースの場所を表す表現であり、サービスの顔として大切である

  • 必要に応じて、GETパラメータ、POSTのボディーなどの追加情報を送信することもある

  • サーバーからの返り値としては、JSONXMLのような構造化テキスト、あるいは画像データなどが返ってくる事が多い

RESTful APIとRPCの違い

  • RPC

URLは1つで、リクエスト時にサービス名とメソッド名を渡す事で「何をするか」を指定します

別の言い方をすると、ウェブサーバーを通じて公開されている静的なオブジェクトのインスタンスをURLを通じて発見し、そのメソッドを呼美ます

HTTPのメソッドは全てPOSTです

  • REST

RESTではリソースとメソッドに対応するURLが複数あります

ex. GET /users/:id、 POST /users、DELETE /users/:id

HATEOAS

HATEOAS (Hypermedia As The Engine Of Application Stat)はRESTの一部である「インターフェースの一般化」を仕様化したもの

リソース間の関連情報やリソースの操作のリンクをレスポンスに含める事で、リソースの自己記述力を向上させます

データに対する操作や関連するリソースへのリンクがレスポンスに含まれるため、完全なHATEOASが実現されていたとすると、クライアントはトップページを見ればそこからデータや操作を表すリンクのリストを得る事ができルため、APIの使用に関する知識がなくても、リンクをたどるだけでAPIの機能が十分使えるようになります

RESTful と RESTish

REST APIは階層化されたリソースをもち、HTTPのシンタックスとセマンティクスを守ったAPI構造を備えることを理想としています

現実には実装を進めていくうちに、URLに動詞が入ったり、バージョンが入ったり、本来はリソースの住所であるはずのURLに余計な情報が入ったりする事があります

RESTを提案したFielding氏は、このような設計のウェブサービスが「REST」を名乗ると激しく攻撃するようです

RESTの設計思想を守りきれない場合、RESTish (REST風) APIという呼び方をします

メソッド

REST APIではサービスが指定するメソッドを使用します

主に使われるのは以下の7つです

  • GET: データの取得

  • POST: データの新規作成

  • PUT: データの更新 (リソースがすでにある場合)

  • DELETE: リソースの削除

  • PATCH: 差分によるデータの更新 (リソースがすでにある場合)

  • HEAD: GETメソッドからボディーを抜いたもの

  • OPTION: 使えるメソッド一覧の取得

ちなみにリソースがない場合にPUTメソッドを使用するとPOSTの時と同様にデータが新規に作成されます

同じ更新処理であるPUTとPATCHの違いについては下のリンクの記事で説明しています

zwzw.hatenablog.com

ステータスコード

ステータスコードはHTTPのレスポンスに含まれる3桁のコードです

百の位の数字で大まかな意味が変わります

  • 100番台 (情報): 成功や失敗が決定する以前のステータスであることを示します

  • 200番台 (成功): 正常終了したことを示します

  • 300番台 (リダイレクト): リダイクレトやキャッシュの変更がない時の通知に使います

  • 400番台 (クライアントエラー): URLが間違っているなどクライアントに起因するエラーが起こったことを示します

  • 500番台 (サーバーエラー): サーバー側でエラーが発生したことを示します

11章の感想

REST APIについては、GETでリソースの情報を取得してPOSTで作成して、、といった基本的な仕様は知っていましたが、どのように定義されているか、RPCと何が違うのかといった部分については説明できなかったので、この章を読んで改めて確認する事ができました

また、自分が勉強用や、入社時の研修で作ったAPIサーバーはRESTishだったなあというのを認識しました