| marp | true |
|---|---|
| paginate | true |
| size | 58140 |
ウェブ実装で必要になる通信の知識
Webアプリを支えるサーバとの通信の
しくみを、ざっくりつかむ!
しくみを、ざっくりつかむ!
- HTTP とは
- URL の構成
- HTTPメソッド(GET / POST)
- HTTP の中身(ヘッダ)
- CORS とは
CHAPTER 1
HTTP は、Webでよく使われる
通信のルール(プロトコル)
通信のルール(プロトコル)
HTTP = Hypertext Transfer Protocol
もとはブラウザ⇄サーバ間の通信用。WebAPIの呼び出しなどにも使われる。
HTTPS は、HTTPの通信を暗号化したもの。盗み見や改ざんを防ぐ。
- SSL:古い暗号化の規格(いまは使われない)
- TLS:SSL の後継。実際に使われているのはこちら
- 慣習で、TLS のことを「SSL」と呼ぶことも多い
つまり HTTPS = HTTP を TLS で暗号化したもの。
この資料は HTTP を前提に解説。詳しくは HTTPS / SSL / TLS で調べてみよう。
この資料は HTTP を前提に解説。詳しくは HTTPS / SSL / TLS で調べてみよう。
通信は1回ごとに独立していて、
前回の続きとしては扱われない
前回の続きとしては扱われない
ステート(状態)+ レス(ない)。
サーバーは前の通信を覚えていない。たとえば「ログイン成功」も保持しない。
サーバーは前の通信を覚えていない。たとえば「ログイン成功」も保持しない。
通信にセッション情報を乗せるので、
ログイン状態は保てる
ログイン状態は保てる
だから HTTP は ステートレスだが、セッションレスではない。
CHAPTER 2
URL は、インターネット上の
リソースへのあて先
リソースへのあて先
URL = Uniform Resource Locator
URI はリソースを識別する仕組みの総称。URL はその一種で、実務ではほぼ URL を使う。
スキーム・ドメイン・ポートの3つをまとめて オリジン と呼ぶ。
// の後ろ、パスの前までの部分。ホストの前に認証用のユーザー情報を含めることもある。オリジンとは違い、スキームを含まず・ユーザー情報を含む。
CHAPTER 3
仕様上のメソッド
GET / POST / PUT / DELETE など
今回は、よく使う GET と POST の2つを見る。
- サーバからデータを取得する
- クエリパラメータを URL に含められる
- URLは人の目に触れやすい → 個人情報は送らない
HTTPメソッドとしてべき等・安全。
ここでの「安全」は、サーバ側へ更新を要求しないという意味。
ここでの「安全」は、サーバ側へ更新を要求しないという意味。
- サーバのデータを更新する
- データは body に含めて送る(=ペイロード)
- URLには出ないが、暗号化はしない
HTTPメソッドとしてべき等でなく・安全でない。
個人情報を扱うなら HTTPS で通信ごと暗号化する。
個人情報を扱うなら HTTPS で通信ごと暗号化する。
同じリクエストを何回処理しても、
サーバのデータが同じ状態になること
サーバのデータが同じ状態になること
ここまではメソッドの定義の話。
GET/POSTを使ったAPIのべき等性・安全性は、サーバ/クライアントの実装しだい。
GET/POSTを使ったAPIのべき等性・安全性は、サーバ/クライアントの実装しだい。
- 新しいタブで開発者ツールを開く(githubログイン中ならシークレットウィンドウ)
Networkタブを開いてgithub.comにアクセス- 一覧の
github.comの行がメソッド GET になっているか確認 - リロードやロゴのクリックで内容が変わらないことを確認(べき等)
- 検索窓に
jiginternなど入れて検索 searchを探し、GET で呼ばれ、Request URL に入力文字列が含まれることを確認- 同じ文字列なら何度でも同じ結果になることを確認
- github にログインする
- 一覧から
sessionを探し、POST で呼ばれていることを確認 - URLにはパスワードが入っていないのに、Payload タブを開くとパスワードが入っていることを確認
- GET:クエリで送る/人に見える情報だけ/べき等な処理に
- POST:body で送る/秘密の情報に/更新する処理に(暗号化はしない)
メソッドは動作や性質が定義されているだけ。
定義どおりに動くよう、サーバ側が実装する必要がある。
定義どおりに動くよう、サーバ側が実装する必要がある。
CHAPTER 4
| ヘッダ | 役割 |
|---|---|
| user-agent | ブラウザ・OS の種類 |
| cookie | サーバから預かった情報(セッションなど) |
| host | 接続先のホスト名 |
| accept | 受け取れるデータ形式 |
| accept-language | 受け取れる言語 |
| accept-encoding | 受け取れる圧縮形式 |
| ヘッダ | 役割 |
|---|---|
| content-type | 本文のデータ形式 |
| Content-Encoding | 本文の圧縮形式 |
| set-cookie | ブラウザに保存させる情報 |
| connection | 接続の扱い方 |
| server | サーバのソフトウェア名 |
ヘッダは基本 ブラウザが自動で付与。慣れるまで自作・付与はしなくてよい。
GETの中身
- ログイン済みの
github.comを開く(リロード) - Nameが
github.comの行をクリック - リクエスト/レスポンスヘッダ、レスポンスボディを確認
POSTの中身
- github にログイン(済みなら一度サインアウト → 再ログイン)
- Nameが
sessionの行をクリック - ヘッダやペイロードを確認
- リクエストもレスポンスも、本体以外の情報をたくさん持つ
- ヘッダから通信の情報を得られる
- ヘッダは任意に足せるが、基本はやらなくてよい
CHAPTER 5
CORS は、オリジンをまたいで
データをやり取りするしくみ
データをやり取りするしくみ
CORS = Cross-Origin Resource Sharing
CSRF や XSS といった攻撃を防ぐため、異なるオリジン間の送受信は標準でブロックされる。
HTML/JS を取ってくるオリジンと、
叩くAPIのオリジンが違うことがある
叩くAPIのオリジンが違うことがある
そこで、安全と認められたオリジン間だけ、またいで通信できるようにしたのが CORS。
8000 のページから、その JS が 3000 の API を呼ぶ。ポートが違う=別オリジンなので CORS が必要。
リクエストに
origin、レスポンスに Access-Control-Allow-Origin を付け、両者が一致すれば受け取れる。
メソッド
GET / HEAD / POST
ヘッダ
Accept / Accept-Language / Content-Language / Content-Type / Range
Content-Type
x-www-form-urlencoded / multipart/form-data / text/plain
加えて、アップロード監視のイベントリスナーや
ReadableStream を使っていないこと。
/transfer-protocolに移動deno run server.jsを実行(サーバは 3000番)- 別ターミナルで
deno run client.jsを実行(クライアントは 8000番) http://localhost:8000を開き、開発者ツールを開くtry corsボタン → Network / Console を確認(エラー)try cors (simple request)ボタン → 正常に受け取れることを確認
/cors はヘッダなし、/cors-additional-header は Access-Control-Allow-Origin: * を付けて返している。
条件を満たせない(主にユーザのデータに影響する)通信では、先に
OPTION で安全性を確認してから本リクエストを送る。
/transfer-protocolに移動deno run server.jsを実行- 別ターミナルで
deno run client.jsを実行 http://localhost:8000を開き、開発者ツールを開くtry cors (prefright request)ボタン → Network / Console を確認
POST で
Content-Type: application/json を持つため単純リクエストにならず、先にプリフライトで必要な許可を確認している。
- オリジンをまたぐアクセスを許すなら CORSの設定を行う
- 条件を満たせないと プリフライト(安全確認の通信)が起きる
- 外部のWebAPI を呼ぶときは CORS の設定が必要になることがある
FINALE
- メソッドは、更新・個人情報なら POST、取得だけなら GET
- サーバ側は、原則そのメソッドの仕様を守って実装する
- ヘッダは基本ノータッチ。ブラウザ任せでよい
自作サーバは別オリジンから叩かれないので、サーバ側のCORSはあまり気にしなくてよい。
クライアントで外部APIを叩くときは、
クライアントで外部APIを叩くときは、
fetch の mode を cors にすればおおむね動く。
もっと深く知りたい人は、参考文献で自学してみよう ◎
