お疲れ様です。
.NET5/Core MVCでセッションを実装した上、ブラウザーにどのように値が渡されているのか?セキュリティ的にOKそうか?までを、実装の現場で検証してみたので、共有します。
この記事の目標:実装手順に加えて、ブラウザー側ではセッション状態がどのように見えるか?セキュリティリスクはないか?を確認する
◇目次
実装準備
.NET5/Core MVCでは、事前にSetup.csへコードを追加する必要があります。(ちなみに、.NET FrameworkではSessionオブジェクトにキーバリューで突っ込むだけでした。実装方法が違うので気を付けましょう。)
Setup.csに、コメントで示した箇所を追加します。
C#
public void ConfigureServices(IServiceCollection services) {
services.AddControllersWithViews();
//追加
services.AddSession(options => {
options.Cookie.Name = "test-test-session"; //名前は任意です。今回はわかりやすいようにこうしています。
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
if (env.IsDevelopment()) {
app.UseDeveloperExceptionPage();
} else {
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
//追加
app.UseSession();
//~中略~
}
セッション変数に値を追加
ここまでで、準備が終わりました。
実際にアプリケーションのコントローラーにて、起動時にセッションを追加する処理を追加してみます。
1行目のusingの追加をお忘れなく。
C#
using Microsoft.AspNetCore.Http;
//~中略~
public IActionResult Index() {
//セッション変数に追加
HttpContext.Session.SetString("keykeykey", "HogeHogeHogeHoge");
return View();
}
起動してブラウザーを確認してみる
セッション利用とセキュリティに関する考察
ステートレスなWebアプリでは、状態管理を行う場合は一般的にクッキーを利用したSessionが推奨されています。
Sessionを利用する場合でも、クッキーにアプリ側が生成する生データをブラウザーに食わせたり、セッションキーが推定可能な値(シリアルな整数など)だったりすると脆弱性が生じます(気になる方は、セッションハイジャックなどの情報を調べてみてください)。
今回確認した.NET Coreにおけるセッションの取り扱いなら恐らく問題なさそうです。(MSが開発するOSSなのでさすがに今更言うまでもないですが・・・。一応、セキュリティに関しては読者様のご責任の下に実装をお願いいたします。)
参考情報:公式ドキュメントからピックアップ
ご参考までに、公式ドキュメント(ASP.NET Core でのセッションと状態の管理(MS Docs/外部リンク))より2点だけピックアップしてコメントしておきます。
セッションデータの保存先はメモリ上になるので、大量データを格納するとメモリを使い果たす可能性があると思われます。気を付けましょう。
不安になる記述ですが、ブラウザーに保持されるので、同じPCでブラウザーのログインアカウントを切り替えても値が保持され続けるよ、と理解しました。
参考リンク
セッション変数の内部実装がGitHubに公開されています。
DistributedSession.cs - GitHub
記事筆者へのお問い合わせ、仕事のご依頼
当社では、IT活用をはじめ、業務効率化やM&A、管理会計など幅広い分野でコンサルティング事業・IT開発事業を行っております。
この記事をご覧になり、もし相談してみたい点などがあれば、ぜひ問い合わせフォームまでご連絡ください。
皆様のご投稿をお待ちしております。