見出し画像

【サイバーセキュリティ】あれもこれもいろいろ送れる「MIMEタイプ」とは?:HTTPで送れるデータ形式

はい、こんにちは!「HTTPで一体何を送ることができるか」知っていますか?私も知らない(汗)。というか、ぜひ知りたい!

ということで、今回は「HTTPで送ることができるデータ」についてお話しします。

MIMEタイプって何だろう?

データの形式と言われて思い浮かべるのは、「拡張子」でしょうか。ファイル名の後ろに追加されてファイル形式を表すものです。例えば、txtとかdocx(Wordファイル)とか。

しかし、データの送受信をする際は、そのデータ形式を識別する仕組みとして別のものが使われます。それが、MIMEタイプ(メディアタイプ)です。

「MIMEってメールでASCII文字以外(添付ファイルなど)を送るときにエンコードするための規格では?」と思った方。その通りです。私も、応用情報技術者試験の勉強をしていたとき、そのように記憶しました。

でも、それだけじゃないんです。HTTPでも、送受信するデータの形式を指定する規格として使用されるようになったんです。メールの方がMIMEを使うという意味では、HTTPより先輩なのですね。

データ形式を指定するヘッダー

受け取りたいデータのMIMEタイプをクライアントが指定する方法については、過去記事でご紹介しましたね。そう、Acceptヘッダーを使うのでした。

主要なMIMEタイプは、リンク先でご確認ください。

タイプ/サブタイプ;q=値

上のように、Acceptヘッダーの値は記述するのでしたね(qは品質係数)。

こんなにある!MIMEタイプ

このMIMEタイプは、IANA(Internet Assigned Numbers Authority)という団体が管理しています。実際には、IANAに登録してなくてもサブタイプは作れて、そのときはサブタイプ名の先頭に「x-」をつけるのがお約束。

では、どれくらいIANA登録のMIMEタイプがあるのでしょうか?20個くらい?私もそんなところかと想像しました。

ところが、こんなにありますよ~。IANAのメディアタイプ一覧ページをご覧ください。

何回スクロールしても終わり一覧の終わりにたどり着かない(笑)。これを全部ブラウザやサーバは解釈できるのかな?世のなかには、いろんなデータ形式が存在することを思い知らされます…。

形式不明なバイナリファイルを送信する

最後に一つ、気になるMIMEタイプをご紹介します。「application/octet-stream」です。何それ?って感じですね。

HTTPでは、サーバが送信するデータのMIMEタイプは、Content-Typeフィールドに記載されます。例えば、

HTMLファイルを送るときは、こうです。

Content-Type: text/html

PNGファイルを送るときはこうです。

Content-Type: image/png

しかし、データ形式がよくわからないバイナリファイルを送ることもあります。特殊なアプリでしか使えないファイルとか。HTTPって柔軟にいろんなファイルを送れるプトロコルなんですね…。

そんなとき、登場するのが、「application/octet-stream」です。「なんとかストリーム!」って何かカッコいいですね。

Content-Type: application/octet-stream

一般にMIMEタイプは、テキスト、画像、音声、動画などに当てはまらないものは、「application」というタイプでくくられます。

さらに上記のIANAにも登録がない形式は、octet-streamというサブタイプになります。「例外の中のさらに例外」的な存在ですねえ。

このようにブラウザ側では、このコンテンツが届いたらどう処理していいかよくわからないので、結果として「名前を付けて保存」をユーザに促すことになります。

HTTP版の「添付ファイル」ってとこですかね…。

便利に使える一方で、脆弱性がありそうな雰囲気もします…。

ということで「application/octet-stream」というMIMEタイプも覚えておきましょう!



はい、本日はここまで!今回は、HTTPでデータを送るときのデータ形式「MIMEタイプ」についてご紹介しました。HTTPって、いろんなデータを送れるんですね。見直しました~。

これでひと通りHTTPについては一区切りとします。これで、ウェブにまつわるいろんな攻撃(セッションハイジャック、CSRF、XSS)を理解する上で、土台となる知識のかなりの部分は知ることができたかな~と思っております。

ただ、実際これらの攻撃に関する解説は、もう少し勉強してからにしたいと思っています。やはりセキュリティって難しい…。

次回からは、「認証」についてご紹介しようと思っています。

ではまた。。


この記事が気に入ったらサポートをしてみませんか?