はじめに
GoでAPIを作ってみた際に画像ファイル名をハッシュ化して保存しました。
なぜハッシュ化するのだろう?クライアント側と通信の際のメリットとは何だろう? という疑問が出てきたので、地元の勉強会でエンジニアの方々に質問したり、調べてみました。
ハッシュ化とは
ハッシュ化とは特定の計算手法に基づいて、元のデータを不規則な文字列に置換する処理を指す。代表的な使用方法としては、パスワードをハッシュ化して保存・管理することが挙げられる。第三者が不正にパスワードへアクセスしたとしても、ランダムな文字列に変換されていることで、悪用されるのを防ぐために利用される。
今回の例では、Go言語のハッシュ関数を使用し、画像データをハッシュ化をすることで、ランダムな文字列のハッシュ値を生成した。ハッシュ関数は入力する元データによって異なるハッシュ値を返す。同じ元データからは同じ値が得られる。また、異なる元データからは別のハッシュ値が生成される。
例えば、下記のようにhinakkoIcon.jpg という画像データがハッシュ化すると、8dff57e....jpgというハッシュ値として保存することができます。
ETagとは
ETag (またはエンティティタグ)は HTTPのレスポンスヘッダーで、リソースの特定バージョンの識別子。ウェブサーバーは、コンテンツが変更されていない場合はレスポンス全体を再送する必要がないので、キャッシュがより効率的になり通信帯域を節約することができる。
初回
Client側からリクエストを受け、レスポンスヘッダーのETagにハッシュ値を付加して返す!例えば10Mダウンロードにかかり、ETag:8dff57e....jpg
が返ってくる!
2回目以降:Serverのハッシュ値変更なし
Client側からリクエスト and 初回時のETagのハッシュ値の情報を受け、「わたしこのデータ(ハッシュ値)をもってるんですけど更新されてたら新しいのをもらえますか?」とServer側に問い合わせる。
Server側のハッシュ値と同じであれば、ダウンロードする必要なし。Client側でキャッシュから取得する。ダウンロードする必要ないので、通信量が減少し、通信を効率化することができる。
2回目以降:Serverのハッシュ値変更あり
Client側からリクエスト and 初回時のETagのハッシュ値の情報を受け、「わたしこのデータ(ハッシュ値)をもってるんですけど更新されてたら新しいのをもらえますか?」とServer側に問い合わせる。
Server側のハッシュ値に変更があれば、ダウンロードする必要あり。例えば10Mダウンロードにかかり、ETag:12cff89e....jpg
が返ってくる!
おわりに
ハッシュ化は第三者からの不正アクセスされた場合に悪用されるのを防ぐために、行われるものであると思ったいましたが、今回紹介したように、ETagにハッシュ値を設定することでClient側とServer側の通信を効率化することにも使用されることがわかりました。
参考文献