HTTPヘッダーのContent-Typeを知らなさすぎたので調べた

技術

ざっくり、自分がわかる程度にメモ。

クライアント → サーバー

送り先(サーバー)に対して、このリクエストのコンテンツは〇〇という種別だよーって示す情報。

例その1

Content-Type: text/html; charset=UTF-8

  • 中身はhtmlコンテンツ(ただのテキストデータ)だよ
  • 文字コードはUTF-8だよ

例その2

Content-Type: multipart/form-data, boundary=SampleBoundary

  • 中身はマルチパート文書(複数のリクエストデータ)だよ
  • 複数ある文書の区切り文字(境界パラメーター?)はSampleBoundaryだよ

サーバー → クライアント

このレスポンスのコンテンツは〇〇という種別だよーって示す情報。

例その1

Content-Type: text/html; charset=UTF-8

  • 中身はhtmlコンテンツ(ただのテキストデータ)だよ
  • 文字コードはUTF-8だよ

例その2

Content-Type: application/octet-stream

  • 中身はよくわからない何か(バイナリー)だよ
  • ファイルのダウンロードのときなんかに使うよ(ブラウザがそう解釈するため)

ついでに出てきたX-Content-Type-Options

レスポンスのContent-TypeのMIMEが欠損していたり、誤っていたりする場合、ブラウザは中身を確認して最適っぽいMIMEを推測する。
これをMIMEスニッフィングという。

この勝手な推測を行わないように設定できるのがX-Content-Type-Options。
ヘッダー情報に X-Content-Type-Options: nosniff を設定することで推測をおこなわず、想定と違うMIMEや欠損MIMEのレスポンスをブロックする。
※nosniffはstyleとscriptにだけ適用されるらしい

雑感

宅急便伝票の品名みたいなものかなって思った。
ここ見なくても中身で判断できるけど、運用とかセキュリティのためにしっかり書くべきところ、みたいな。

Javaでシステム開発してた時、csvダウンロード機能のレスポンスヘッダーにapplication/octet-streamを設定してた理由がようやくわかった。
その時に調べておくべきなんだろうけど、すっかり忘れてた…。
まあ、この機会に覚えられてよかったということで。

ただ、正直マルチパートのboundaryについては理解がちょっと微妙。
意味はわかった気になってるけど、結構フワッとしてるかもしれない。

参考サイト

Content-Type
Content-Type エンティティヘッダーは、リソースのメディア種別を示すために使用します。
MIME タイプ (IANA メディアタイプ)
メディアタイプ (別名 Multipurpose Internet Mail Extensions または MIME タイプ) は、文書、ファイル、またはバイト列の性質や形式を示す標準です。
X-Content-Type-Options
X-Content-Type-Options は HTTP のレスポンスヘッダーで、 Content-Type ヘッダーで示された MIME タイプを変更せずに従うべきであることを示すために、サーバーによって使用されるマーカーです。これにより、MIME タイプのスニッフィングを抑止することができます。すなわち、ウェブマ...
フォームよるファイルアップロードの仕様 - Jakarta Commons FileUploadの利用手順
フォームよるファイルアップロードの仕様

コメント

タイトルとURLをコピーしました