[22] [[Web]] における[[クライアント]]は、[[鯖]]に対してサービスの提供を要求する[[ソフトウェア部品]]です。

* 仕様書

[REFS[
- [2] '''[CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230#section-2.1>'''
- [7] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-8.2>
- [59] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-17>
- [11] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-18>
- [13] [CITE@en[RFC 5849 - The OAuth 1.0 Protocol]]
([TIME[2014-12-28 14:19:21 +09:00]] 版)
<http://tools.ietf.org/html/rfc5849#section-1.1>
- [18] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#section-1.1>
- [21] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#section-2>
- [29] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#section-10.11>
- [31] [CITE@en[Final: OpenID Connect Core 1.0 incorporating errata set 1]] ([TIME[2014-11-09 04:00:29 +09:00]] 版) <http://openid.net/specs/openid-connect-core-1_0.html#rfc.section.1>
- [33] [CITE@en[Final: OpenID Connect Core 1.0 incorporating errata set 1]] ([TIME[2014-11-09 04:00:29 +09:00]] 版) <http://openid.net/specs/openid-connect-core-1_0.html#Terminology>
- [34] [CITE@en[RFC 6455 - The WebSocket Protocol]] ([TIME[2015-03-11 20:42:50 +09:00]] 版) <http://tools.ietf.org/html/rfc6455#section-4>
- [42] [CITE@en[RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)]] ([TIME[2015-05-15 10:14:54 +09:00]] 版) <https://tools.ietf.org/html/rfc7540#section-2.2>
- [44] [CITE@en[RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)]] ([TIME[2015-05-15 10:14:54 +09:00]] 版) <https://tools.ietf.org/html/rfc7540#section-3>
]REFS]

* HTTP クライアント

[3] [DFN[[RUBYB[[[クライアント]]]@en[client]]]]は、
一つ[[以上]]の[[HTTP要求]]を[[送信]]するために[[鯖]]に[[接続]]を[[確立]]する[[プログラム]]です
[SRC[>>2]]。

[4] 「[[利用者エージェント]]」も同じような定義になっていますが、
[[利用者エージェント]]だけでなく[[串]]や[[関門]]も、
[[上流]]に対しては[[クライアント]]とみなされるようです。

;; [24] しかし一般的には[[串]]のことを考慮せず、[[クライアント]]と[[利用者エージェント]]を同義語として使うことが多いようです。
例えば以降で示す [[WebDAV]] や [[OAuth]]  の[[クライアント]]が[[串]]も含むとは考え難いです。

[43] [[HTTP/2]] の[DFN[[RUBYB[[[クライアント]]]@en[client]]]]は、
[[HTTP/2接続]]を[RUBYB[開始]@en[initiate]]する[[エンドポイント]]です [SRC[>>42]]。
[[クライアント]]は、[[HTTP要求]]を送信し、[[HTTP応答]]を受信します [SRC[>>42]]。
[[クライアント]]は、 [[TCP接続]]の [[initiator]] です [SRC[>>44]]。

[45] [[HTTP]] の仕様では、 [[クライアント]]の挙動が (各プロトコル要素をどう送受信するべきかなど)
断片的に規定されています。

[46] [[Fetch Standard]] では、[[利用者エージェント]]がどのように[[要求]]を生成し、
[[応答]]を処理するべきかが規定されています。

[47] その他の [[HTTP]] を使った[[アプリケーション]] ([[WebDAV]] や [[OAuth]] など)
では、それぞれの技術を実装する[[クライアント]]の挙動が規定されています。

[48] 実用的な汎用[[HTTPクライアント]]ライブラリーは、次の機能を備える必要がありそうです。

[FIG(short list)[
- [[fetch]] の実装に必要な入出力を備えた [[API]]
- [[素のHTTP]]本体
- [[WebSocket]]
- [[HTTP/2]]
- [[HTTPS]]
- [[HTTPプロキシ]]
- [[基本認証]]
- [[OAuth 1.0]] [[認証された要求]]の作成
- [[AWS4]]
- [CODE[gzip]] [[内容符号化]]
- [[UTF-8]]
- [CODE(MIME)@en[application/x-www-form-urlencoded]]
- [CODE(MIME)@en[multipart/form-data]]
]FIG]

* WebDAV クライアント

[23] [[WebDAV]] [[クライアント]]は、 [[HTTP]] 本体に加えて [[WebDAV]]
を実装する[[クライアント]]です。

[12] [[WebDAV]] [[クライアント]]は、 [[HTTP/1.1]] に適合しなければ[['''なりません''']]
[SRC[>>11]]。

[8] [[WebDAV]] [[クライアント]]は、 [[XML 1.0]] と [[XML名前空間 1.0]]
を実装しなければ[['''なりません''']] [SRC[>>7]]。

[9] [[WebDAV]] [[クライアント]]は、[[応答]]が[[整形式]]でなければ、
[[要求メソッド]]が実行されたかどうかを仮定しては[['''ならず''']]、
[[鯖]]の動作がおかしいと考える[['''べきです''']] [SRC[>>7]]。

[60] [[WebDAV]] [[クライアント]]は、 [[WebDAV]] の [[XML文書]] ([[死特性]]以外)
の未知の[[要素]]や[[属性]]、既知ながら想定されていない場所で使われている[[要素]]や[[属性]]について、
無視して処理しなければ[['''なりません''']] [SRC[>>59]]。
[[生特性]]の値でも原則として無視する[['''べきです''']] [SRC[>>59]]。

[10] [[処理指令]]は無視する[['''べきです''']] [SRC[>>59]]。

* OAuth 1.0 クライアント (消費者)

[15] [[OAuth 1.0]] における[DFN[[RUBYB[[[クライアント]]]@en[client]]]]は、
[[OAuth]] の[[認証された要求]]を使うことができる [[HTTPクライアント]]です [SRC[>>13]]。

;; [14] 元々は[DFN[[RUBYB[[[消費者]]]@en[consumer]]]]ともいいました [SRC[>>13]]。

[16] [[Webアプリケーション]]が他の [[Webアプリケーション]]の [[Web API]]
を [[OAuth]] により使う場合だと、最初の [[Webアプリケーション]]が[[クライアント]]に当たります。
両 [[Webアプリケーション]]を使う[[利用者]]は[[資源所有者]]に当たり、
[[OAuth]] における[[クライアント]]で無いので注意が必要です。

;; [17] [[OAuth]] の元の用語では[[消費者]]と言っていたので混同の虞は無かったのですが、
[[IETF]] で変更されてしまいました。

[27] [[クライアント]]は、次の[[エンドポイント]]を持つことができます。
[FIG(short list)[
- [[コールバックURL]]
]FIG]

* OAuth 2.0 クライアント

[19] [DFN[[RUBYB[[[クライアント]]]@en[client]]]]は、[[資源所有者]]にかわって、その[[認可]]に基づき[[被保護資源要求]]を行う[[応用]]です [SRC[>>18]]。

;; [20] 実装の性質は特に制限されず、[[鯖]]、[[デスクトップ]]、その他どの[[装置]]で実行される[[応用]]であっても構いません [SRC[>>18]]。

[25] [[OAuth 2.0]] の利用に先立ち[[クライアント]]は[[認可鯖]]に登録することになっています
[SRC[>>21]]。

;; [[クライアントの登録]]参照。

[26] [[クライアント]]は、次の[[エンドポイント]]を持つことができます。
[FIG(short list)[
- [[リダイレクトエンドポイント]]
]FIG]

[28] [[クライアント]]は、[[クライアント型]]により分類されます。

[30] [[クライアント]]の開発者は、[[フィッシング]]防止のため、
[[利用者エージェント]]を埋め込むか外部のものを利用するかの判断や[[認可鯖]]が正しいサーバーか検証する手段の提供など配慮するべきです [SRC[>>29]]。

[32] [[OpenID Connect]] を実装する [[OAuth 2.0]] [[クライアント]]を
[DFN[[[Relying Party]]]] ([DFN[[[RP]]]]) といいます [SRC[>>31]]。
すなわち、 [[OpenID Provider]] による[[末端利用者]]の[[認証]]と [[claim]]
が必要な[[応用]]をいいます [SRC[>>33]]。

* WebSocket クライアント

[41] [[WebSocket handshake]] を開始して[[WebSocketサーバー]]と通信するものを、
[[WebSocketクライアント]]といいます。

[35] 特定の[[通信事業者]]の[[携帯電話]]上の[[ブラウザー]]など、
管理された環境下で動作する[[クライアント]]は、ネットワーク上の他者に
[[WebSocket接続]]の管理を委託しても構いません。その場合、
[[携帯電話]]上のソフトウェアと委託先を含めた全体を[[クライアント]]といいます [SRC[>>34]]。

[36] 元々 [[WebSocket]] は [[Webブラウザー]]と[[サーバー]]との通信のためのプロトコルですが、
[[Webブラウザー]]以外の[[クライアント]]が使うこともできます。

;; [37] 例えば、[[Webブラウザー]]と専用クライアントとで共通した
[[WebSocket]] を用いたチャットアプリケーションを実装できます。

;; [38] [[Webブラウザー]]で使わないなら、 [[TCP]] を普通に使えば良いので、
[[WebSocket]] を使う利点は特にありません。 [[Webブラウザー]]ではセキュリティー上の理由から
[[TCP]] を[[著者]]にそのまま使わせることができないため、
[[WebSocket]] が開発されました。

[39] [[HTML Standard]] は [[Webブラウザー]]向けの [[WebSocketクライアント]]として
[CODE(DOMi)@en[[[WebSocket]]]] [[インターフェイス]]を規定しています。

[40] [[Webブラウザー]]以外の[[クライアント]]はこの規定に従う必要はありませんが、
実用上、同様のものを (各[[プログラミング言語]]や[[フレームワーク]]などに合わせた形にして)
実装するのが好ましいと思われます。

[FIG(list short)[
- [[WebSocket接続の確立]]
- [[WebSocketメッセージ受信]]
- [[WebSocketメッセージ送信]]
- [[[CODE[Ping]]フレーム]]送信
- [[[CODE[Pong]]フレーム]]送信
- [[WebSocket closing handshake]]
]FIG]

* 実例

[FIG(short list)[ [49] [[HTTPクライアント]]
- 各種 [[Webブラウザー]]
- [[wget]]
- [[curl]]
- [[LWP]]
- [CODE[AnyEvent::HTTP]]
- [[Streamlink]]
- [[youtube-dl]]
]FIG]

* 関連

[5] [[クライアント]]からの[[HTTP要求]]を受け取って[[HTTP応答]]を[[クライアント]]に送信するものを、
[[鯖]]といいます。

[6] [[クライアント]]は[[HTTP要求]]に関しては[[送信者]]、[[HTTP応答]]に関しては[[受信者]]となります。

* 歴史

[FIG(quote)[
[FIGCAPTION[
[1] [[HTTP]] ([[RFC 1945]] 1.2, [[RFC 2068]] 1.3, [[RFC 2616]] 1.3)
]FIGCAPTION]
>
:client: A[DEL[n application [INS[{1945}]]]]
program that establishes connections for the purpose of sending requests.

:クライアント: 
[[要求]]を送信する目的で[[接続]]を確立する[DEL[応用]]プログラム。
]FIG]
