💡gntk.dev

よく䜿うHTTPヘッダを理解する

HTTPヘッダの皮類や扱い方を理解しおおくこずは、WEBサヌビスを扱う䞊で避けおは通れたせん。

post-cover

なぜ調べたか

Praha Challengeずいうプログラミング・ブヌトキャンプに参加するこずになりたした。最初の課題ずしお、よく䜿うHTTPヘッダに぀いお調べお、クむズ䜜っおペア他の参加者の人に出題するずいうものに取り組みたした。

HTTPヘッダっお䜕なのかずかどんなのがあるのかみたいなのは本読んだりしたこずはあるのですが、孊んだこずたずめおみたりクむズ䜜ったりっおいうアりトプットはしたこずなかったので、孊びになりたした。

せっかくなので調べた内容をたずめお蚘事にしようず思いたした。

HTTPヘッダの重芁性

HTTPヘッダは、HTTPのメッセヌゞボディに察する付加的な情報いわゆるメタデヌタを衚珟するものです。クラむアントやサヌバヌはHTTPのメッセヌゞを受け取ったら、たずヘッダを芋おボディに察する挙動を決定したす。

リ゜ヌスぞのアクセス暩を蚭定する認蚌、クラむアントずサヌバヌの通信回数ず量を節玄するためのキャッシュなどはヘッダの情報があっお実珟する機胜です。ヘッダの皮類や扱い方を理解しおおくこずは、WEBサヌビスを扱う䞊で避けおは通れたせん。

䞻芁なHTTPヘッダ

Host

HTTPリク゚ストが送信される先のサヌバヌのホスト名ずポヌト番号を指定したす。

Host: <host>:<port>
  • <host> 
 サヌバヌのドメむン名 䟋example.jp
  • <port> 
 指定するポヌト番号指定されなかった堎合、HTTPSのURLであれば443、HTTPのURLであれば80ずみなされる

Hostはすべおのリク゚ストメッセヌゞで必ず指定する必芁がありたす。

Content-type

そのメッセヌゞのボディの内容がどのような皮類なのかを、MIMEMultipurpose Internet Mail Extensionsずいう電子メヌルの仕様から拝借しおきた仕様を䜿っお衚珟するヘッダです。

Content-Type: <type>/<subtype>; charaset=<charaset>
  • <type>/<subtype> 
 メディアタむプ。MIMEの仕様。
  • <type> 
 タむプ。リ゜ヌスの衚珟の皮類をざっくり指定する。RFC2046で9぀定矩されおいる。䟋application
  • <subtype> 
 サブタむプ。タむプに玐぀いおリ゜ヌスの衚珟の皮類を詳现に指定する。䟋xhtml+xml
  • <charaset> 
 リ゜ヌスの文字゚ンコヌディングの指定。省略可胜。

タむプの䞀芧

タむプ 意味 メディアタむプの䟋
text 人が読んで盎接理解できるテキスト text/plain
image 画像デヌタ image/jpeg
audio 音声デヌタ audio/mpeg
video 映像デヌタ video/mp4
application その他のデヌタ application/pdf
multipart 耇数のデヌタから成る耇合デヌタ multipart/related
message 電子メヌルメッセヌゞ message/rfc822
model 耇数次元で構成するモデルデヌタ model/vrml
example 䟋瀺甚 example/foo-bar

User-agent

リク゚ストを行うナヌザヌ゚ヌゞェント゜フトりェアりェブブラりザなどのこずのOS、ベンダヌ、バヌゞョンを識別するためのヘッダのこずです。

User-Agent: <product>/<product-version><comment>
  • <product> 
 補品の識別子。䟋Mozilla
  • <product-version> 
 補品のバヌゞョン情報。
  • <comment> 
 補品のより詳现な情報

䟋えばFirefoxのUser-agentは䞋蚘のようになりたす

Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0
  • Mozilla/5.0は、Mozillaず互換性があるブラりザであるこずを瀺しおいたす珟圚はほがすべおのブラりザで共通
  • Windows NT 6.1; Win64; x64; rv:47.0は、Windows7で動いおいるこずを瀺しおいたす。rvはGecko埌述のバヌゞョンです。
  • Gecko/20100101は、HTMLレンダリング゚ンゞンGeckoを搭茉したブラりザであるこずを瀺しおいたす20100101は固定文字列
  • Firefox/47.0は、ブラりザヌがFirefox47.0であるこずを瀺しおいたす。

Accept

メディアタむプや文字゚ンコヌディングは、サヌバヌが䞀方的に決定するだけではなく、クラむアントず亀枉しお決めるこずができ、この手法はコンテントネゎシ゚ヌションず呌ばれたす。Acceptは、クラむアントが凊理できるデヌタの皮類をサヌバヌに通知するヘッダです。

Accept: <type>/<subtype>,<type>/<subtype>, ..., <type>/<subtype>;q=<qvalue>,...
  • <type>/<subtype> 
 クラむアントが凊理できるメディアタむプをMIMEタむプで䌝えたす。サヌバヌは、この提案のうち䞀぀を遞択したす。
  • ;q=<qvalue> 
 メディアタむプの優先順䜍を決める重みで、0〜1の数倀で衚したす。数倀が倧きいほうが優先されたす。
Accept: text/html, application/xhtml+xml, application/xml;q=0.9, image/webp, */*;q=0.8

この堎合、text/html、application/xhtml+xml、image/webpはデフォルトの1で最優先、application/xmlが0.9、それ以倖が0.8ずいう優先床です。

Referer

珟圚リク゚ストしおいるペヌゞぞリンクしおいた、前のりェブペヌゞのアドレスです。どこのりェブサむトからリンクされおきたかを衚しおいたす。

Referer: <url>
  • <url> 
 盎前のペヌゞのURIです。

Refererヘッダに぀いおは、詳现をナヌスケヌスずしお埌述したす。

Accept-Encoding

コンテントネゎシ゚ヌションを䜿甚しお、クラむアントが凊理できるコンテンツの゚ンコヌディング圧瞮アルゎリズムなどをサヌバヌに通知するヘッダです。サヌバヌは、提案されたものから䞀぀を遞択しお䜿甚し、Content-Encodingヘッダを䜿甚しおクラむアントに遞択結果を知らせたす。

Accept-Encoding: <encoding>,<encoding>, 
 ,<encoding>;q=<qvalue>, 

  • <encoding> 
 gzip, compress, deflateなどの圧瞮圢匏を指定したり、identityを蚭定しお゚ンコヌドしないこずを指定するこずもできたす。たた、qvalueで優先順䜍を決めるこずもできたす。

Authorization

ナヌザヌ゚ヌゞェントがサヌバヌから認蚌を受けるための蚌明蚌を保持するヘッダです。ナヌザヌ゚ヌゞェントからのリク゚ストが送られたあずにサヌバヌから401 Unauthorizedが返っおきた堎合アクセスしたペヌゞの衚瀺に認蚌が必芁だった堎合、ナヌザヌ゚ヌゞェントの次のリク゚ストで䜿甚される認蚌に必芁な情報を送信するこずが倚いヘッダです。

Authorization: <type> <credentials>
  • <type> 
 認蚌の皮類で、BasicやDigest、Bearerなどが蚭定される。
  • <credentials> 
 認蚌情報が蚭定される。䟋えば<type>にBasicが蚭定された堎合、コロンで結合したナヌザヌ名ずパスワヌドをBase64で゚ンコヌドした文字列が蚭定される。

Authorizationヘッダに぀いおは、詳现をナヌスケヌスずしお埌述したす。

Location

サヌバヌがリク゚ストを受信したずき、ナヌザヌ゚ヌゞェントが芁求したURLずは別のURLにリダむレクトさせたい堎合にレスポンスに蚭定するヘッダです。

Location: <url>
  • <url> 
 リダむレクトさせたい先のURL。

ナヌスケヌス

Refererヘッダのリスクに぀いお

Refererヘッダによっお送られる情報は、HTML芁玠に特定の属性を蚭定したり別のヘッダを蚭定するこずで制埡するこずができたす。

なぜRefererによっお送られる情報の制埡が必芁なのか

Refererヘッダには、プラむバシヌずセキュリティのリスクがありたす。Refererぞの情報の枡し方によっおは、ナヌザヌの機密情報が挏掩しおしたう可胜性がありたす。たずえば、デヌタの送信にPOSTではなくGETを䜿甚し、ク゚リパラメヌタにナヌザヌのパスワヌドなどを茉せた堎合、ナヌザヌのパスワヌドはク゚リパラメヌタずしおwebサヌバヌのアクセスログ・ファむアりォヌルのログ・プロキシサヌバヌのキャッシュやログ・ブラりザのキャッシュや履歎など、さたざたな堎所に蚘録されおしたいたす。

䞊蚘のようなリスクを軜枛するために、䞋蚘のような察策を取るこずができたす。

  • 挏掩しおはたずい情報の送信にはPOSTを䜿甚する
  • 通信プロトコルはHTTPではなくHTTPSを䜿甚し、通信を暗号化する
  • Referrer-Policyヘッダを䜿甚し、Refererヘッダによっお送られる情報を制埡する埌述
  • imgやaなどのHTML芁玠のrel属性にno-referrerを蚭定しお、Refererヘッダによっお送られる情報を制埡する
  • imgやaなどのHTML芁玠のreferrerpolicy属性を䜿甚し、Refererヘッダによっお送られる情報を制埡する2020幎12月29日時点でMDN Web Docsでは「実隓的な機胜」ずされおいる

Referrer-Policyヘッダによるリファラヌ情報の制埡

Referrer-Policyヘッダを䜿えば、Refererによっお送られるリファラヌ情報を制埡するこずができたす。

Referrer-Policy: <policy>
  • <policy> 
 どのような制埡を行うかを蚭定できる。䞋蚘のpolicyが利甚できる。

    • no-referrer 
 すべおのリファラヌ情報が省略される。
    • no-referrer-when-downgrade 
 Referrer-Policyが蚭定されおいない堎合はこのpolicyが既定倀ずしお蚭定される。HTTPからHTTPぞの送信やHTTPSからHTTPSぞの送信などプロトコルのセキュリティ氎準が同䞀である堎合、もしくはHTTPからHTTPSぞの送信など改善される堎合は、URLのオリゞン・パス・ク゚リ文字がリファラヌずしお送信される。HTTPSからHTTPぞの送信などプロトコルのセキュリティ氎準が䜎䞋する堎合は、すべおのリファラヌが省略される。
    • origin 
 文曞のオリゞンのみが送信される。オリゞンずは、URLのスキヌム・ホスト・ポヌトによっお定矩されるパスはオリゞンに含たれない。
    • origin-when-cross-origin 
 同䞀オリゞン間でリク゚ストを行う堎合、オリゞン・パス・ク゚リパラメヌタを送信する。同䞀オリゞンでない堎合はオリゞンのみ送信する。
    • same-origin 
 同䞀オリゞン間でリク゚ストを行う堎合、リファラヌを送信する。同䞀オリゞンでない堎合はすべおのリファラヌ情報が省略される。
    • strict-origin 
 HTTPからHTTPぞの送信やHTTPSからHTTPSぞの送信などプロトコルのセキュリティ氎準が同䞀である堎合、もしくはHTTPからHTTPSぞの送信など改善される堎合、文曞のオリゞンを送信する。HTTPSからHTTPぞの送信などプロトコルのセキュリティ氎準が䜎䞋する堎合は、すべおのリファラヌが省略される。
    • strict-origin-when-cross-origin 
 同䞀オリゞン間でリク゚ストを行う堎合、オリゞン・パス・ク゚リパラメヌタを送信する。同䞀オリゞンでない堎合は、すべおのリファラヌが省略される。
    • unsafe-url  すべおのリファラヌ情報が送信される。

同䞀オリゞンポリシヌに぀いお

前述のReferrer-Policyヘッダによるリファラヌ情報の制埡では、「同䞀オリゞン間でリク゚ストを行う堎合」や「同䞀オリゞンでない堎合」など、同䞀オリゞンかどうかずいう条件がいく぀かでおきたした。あるオリゞンから読み蟌たれた文曞やスクリプトに぀いお、そのリ゜ヌスから他のオリゞンのリ゜ヌスにアクセスできないように制限する仕組みのこずを同䞀オリゞンポリシヌず呌びたす。

オリゞンの定矩

オリゞンは、URLのスキヌムhttp://, https://、ホストexample.com、ポヌト:80, :443によっお定矩されたす。ある2぀のりェブコンテンツにおいお、スキヌム、ホスト、ポヌトがすべお䞀臎した堎合、その2぀のりェブコンテンツは同䞀オリゞンであるずいえたす。

Authorizationヘッダによる認蚌に぀いお

リ゜ヌスぞのアクセスに制限がかかっおいる堎合、Authorizationヘッダに認蚌情報を付䞎する必芁がありたす。Authorizationヘッダで蚭定できる認蚌方法を3぀玹介したす。

Basic認蚌

"<username>:<password>"をbase64で゚ンコヌドした文字列が認蚌情報ずしお扱いたす。認蚌情報がデコヌド可胜なので、デヌタの盗聎などを防ぐためにはHTTPSプロトコルを利甚しお通信を暗号化するなどの察応が必芁です。

Digest認蚌

サヌバヌから送られおきたランダムな文字列nonceずパスワヌドを組み合わせおハッシュ倀を生成し、それを認蚌情報ずしお扱う認蚌方匏です。認蚌情報は暗号化されおいたすが、メッセヌゞのボディは暗号化されないため、メッセヌゞのボディの盗聎を防ぐためにはHTTPSプロトコルを利甚しお通信を暗号化するなどの察応が必芁です。

Bearer認蚌

事前に入手したトヌクンBearer tokenをAuthorizationヘッダに蚭定しおリク゚ストを送り、サヌバがそれを確認するこずで認蚌を行う認蚌方匏です。クラむアントが事前に入手するトヌクンは、認可サヌバヌに芁求しお発行しおもらう方匏OAuthで取埗したす。

Cache-Controlヘッダによるキャッシュの制埡に぀いお

キャッシュずは、取埗した情報を再利甚するための仕組みです。キャッシュをうたく利甚すれば、クラむアントずサヌバヌの通信回数ず量を節玄するこずができたす。Cache-Controlヘッダを利甚すれば、情報の怜蚌情報を再取埗すべきかどうかを刀断するず再取埗キャッシュを利甚せず改めお情報を取埗するの条件を蚭定できたす。

no-store

Cache-Control: no-storeを指定するず、レスポンスをキャッシュに保存できなくなりたす。

max-age

Cache-Control: max-age=<seconds>を指定するず、キャッシュが保存されおから<seconds>秒が経過するたではリ゜ヌスは叀くないずみなされ、曎新されなくなりたす。぀たり、キャッシュの有効期限が蚭定できたす。蚭定した時刻が経過しお以降にレスポンスを受け取るず、キャッシュは曎新されたす。

no-cache

Cache-Control: no-cacheを指定するず、栌玍されたレスポンスは、䜿甚する前にかならず怜蚌されたす有効期限が切れおいなくおも怜蚌されたす。

must-revalidate

Cache-Control: must-revalidateを指定するず、栌玍されたレスポンスは、有効期限が切れおいる堎合、䜿甚する前にかならず怜蚌されたす。

参考文献

© 2021 gntk.dev