カテゴリ: Play Framework 更新日: 2026/03/31

Play Frameworkでクッキーを守る!Secure属性とHttpOnly属性の設定方法を徹底解説

CookieのSecure属性・HttpOnly属性の活用
CookieのSecure属性・HttpOnly属性の活用

先生と生徒の会話形式で理解しよう

生徒

「Play Frameworkでアプリを作っているのですが、クッキーのセキュリティ設定について教えてください。Secure属性やHttpOnly属性って何のためにあるんですか?」

先生

「これらは、ログイン情報などが含まれる大切なクッキーを、盗聴や不正なプログラムから守るための非常に重要な設定です。Webアプリを公開するなら必須の知識ですよ。」

生徒

「難しそうですね…。Play Frameworkでは、プログラムをたくさん書かないと設定できないのでしょうか?」

先生

「いいえ、Play Frameworkなら設定ファイルに数行書くだけで、アプリ全体のクッキーを安全に保護できます。具体的な仕組みと設定方法を、初心者の方にも分かりやすく説明しますね!」

1. クッキーのセキュリティ属性が必要な理由

1. クッキーのセキュリティ属性が必要な理由
1. クッキーのセキュリティ属性が必要な理由

Webアプリケーションにおいて、ログイン状態を維持するために使われるのがクッキー(Cookie)です。 Play Frameworkではセッション情報がクッキーに保存されますが、もしこのクッキーが第三者に盗まれてしまうと、そのユーザーになりすまして操作される「セッションハイジャック」という攻撃を許してしまいます。

特に、公共のWi-Fiを利用している際の通信盗聴や、悪意のあるウェブサイトから実行されるスクリプトなどは大きな脅威です。 これらのリスクを最小限に抑えるために、ブラウザに対して「このクッキーは安全な時だけ扱ってね」と命令を下すのが、Secure属性やHttpOnly属性の役割です。 Javaエンジニアとして、機能を作るだけでなく、ユーザーを守るための防御策を学ぶことは非常に大切です。

2. Secure属性で通信経路を保護する仕組み

2. Secure属性で通信経路を保護する仕組み
2. Secure属性で通信経路を保護する仕組み

Secure属性とは、クッキーを「HTTPS(暗号化された通信)」のときだけ送信するように制限するフラグです。 通常のHTTP通信はデータが暗号化されていないため、通信経路上で中身を覗き見られる可能性があります。

この属性を有効にすると、ブラウザは暗号化されていない接続ではクッキーを送らなくなります。 これにより、万が一ユーザーが間違って暗号化されていないページにアクセスしても、大切なログイン情報が漏洩するのを防ぐことができます。 現代のWebアプリでは常時SSL(HTTPS化)が当たり前となっているため、この設定も実運用ではほぼ必須と言えます。

3. HttpOnly属性でJavaScriptからの攻撃を遮断する

3. HttpOnly属性でJavaScriptからの攻撃を遮断する
3. HttpOnly属性でJavaScriptからの攻撃を遮断する

HttpOnly属性は、JavaScriptからそのクッキーにアクセスできないように制限する設定です。 これは「クロスサイトスクリプティング(XSS)」という、Webサイトに不正なスクリプトを埋め込む攻撃への対策として非常に強力です。

通常、JavaScriptを使えばブラウザに保存されたクッキーの内容を読み取ることができますが、HttpOnly属性が付いたクッキーはプログラムからは見えなくなります。 通信(HTTPリクエスト)には今まで通り自動で付与されるため、Webアプリとしてのログイン機能は維持したまま、攻撃者のスクリプトからは中身を守れるというわけです。

4. application.confでの設定方法

4. application.confでの設定方法
4. application.confでの設定方法

Play Frameworkでは、conf/application.conf という設定ファイルを編集するだけで、アプリケーション全体にこれらのセキュリティ設定を適用できます。 個別のJavaコードでクッキーを操作する手間が省けるため、設定漏れが起きにくいのがメリットです。

以下のコード例では、セッションクッキーに対してSecure属性とHttpOnly属性を有効にする設定を記述しています。


# クッキーのセキュリティ設定
# HTTPS接続時のみ送信するようにする
play.http.session.secure = true

# JavaScriptからのアクセスを禁止する
play.http.session.httpOnly = true

# 同じサイト内からのリクエストに制限する(CSRF対策)
play.http.session.sameSite = "lax"

5. Javaプログラムで個別にクッキーを生成する場合

5. Javaプログラムで個別にクッキーを生成する場合
5. Javaプログラムで個別にクッキーを生成する場合

フレームワークのセッション機能以外で、独自にクッキーをユーザーに送信したい場合もあります。 その際は、Javaのコード内で Http.CookieBuilder を使って属性を一つずつ設定します。

初心者が自分でクッキーを作る場合は、以下のサンプルのように必ず withSecurewithHttpOnly を意識して記述するようにしましょう。


package controllers;

import play.mvc.*;
import play.mvc.Http.Cookie;

public class CookieController extends Controller {
    public Result setCustomCookie() {
        // 安全な設定を盛り込んだクッキーを作成
        Cookie secureCookie = Cookie.builder("user_pref", "dark_mode")
            .withMaxAge(java.time.Duration.ofDays(30))
            .withSecure(true)    // HTTPSのみ
            .withHttpOnly(true)  // JSアクセス禁止
            .build();

        return ok("クッキーをセットしました")
            .withCookies(secureCookie);
    }
}

6. 設定が適用されているかブラウザで確認する

6. 設定が適用されているかブラウザで確認する
6. 設定が適用されているかブラウザで確認する

設定が終わったら、実際に属性が適用されているか自分の目で確認してみましょう。 Google Chromeなどのブラウザを使えば、簡単にチェックできます。

まず、開発したアプリを起動してページにアクセスします。 次に、F12キーを押して「デベロッパーツール」を開き、「Application(アプリケーション)」タブの左側メニューから「Cookies」を選択します。 一覧の中に自分のアプリのクッキーが表示され、「HttpOnly」や「Secure」の列にチェックが入っていれば成功です!


Name: PLAY_SESSION
Value: (暗号化された文字列)
HttpOnly: ✓
Secure: ✓
SameSite: Lax

7. 開発環境における注意点とトラブル対応

7. 開発環境における注意点とトラブル対応
7. 開発環境における注意点とトラブル対応

ここで一つ、初心者が必ずハマる注意点があります。 それは、play.http.session.secure = true に設定していると、ローカル環境(http://localhost:9000など)でログインができなくなる場合があることです。

Secure属性はHTTPSでないとクッキーを送らないため、暗号化されていない開発環境ではブラウザがクッキーを拒否してしまうのです。 この問題を解決するには、開発環境用の設定ファイル(dev.confなど)を用意して secure = false にするか、開発環境自体をHTTPS化する必要があります。


package controllers;

import play.mvc.*;
import com.typesafe.config.Config;
import javax.inject.Inject;

public class DebugController extends Controller {
    @Inject Config config;

    public Result checkConfig() {
        // 設定値を取得して確認するデバッグ用コード
        boolean isSecure = config.getBoolean("play.http.session.secure");
        return ok("現在のSecure設定は: " + isSecure);
    }
}

8. SameSite属性との組み合わせによる相乗効果

8. SameSite属性との組み合わせによる相乗効果
8. SameSite属性との組み合わせによる相乗効果

SecureやHttpOnlyと並んで、最近のWeb標準で重要視されているのが「SameSite属性」です。 これは、他のサイトから自分のサイトに対してリクエストが送られた際に、クッキーを送信するかどうかを制御するものです。

クロスサイトリクエストフォージェリ(CSRF)という、ユーザーの意図しない操作を勝手に実行させる攻撃を防ぐのに役立ちます。 Play Frameworkではデフォルトで Lax という比較的安全な値が設定されています。 これら三つの属性(Secure, HttpOnly, SameSite)を正しく組み合わせることで、鉄壁のクッキー管理を実現できます。

9. 初心者が意識すべきセキュリティの第一歩

9. 初心者が意識すべきセキュリティの第一歩
9. 初心者が意識すべきセキュリティの第一歩

いかがでしたでしょうか。クッキーの属性設定は、一見地味ですがWebアプリの安全性を支える土台となる部分です。 Javaでのプログラミングスキルを磨くのと並行して、こうしたブラウザの仕組みやHTTPのルールを知ることで、より信頼されるエンジニアへと成長できます。

まずは自分のプロジェクトの application.conf を見直すところから始めてみてください。 一つ一つの設定が何を意味しているのかを理解し、実際にブラウザで確認する習慣をつけることが、安全なWebアプリ開発への近道です。 これからもPlay Frameworkを使って、楽しく安全な開発を続けていきましょう!

カテゴリの一覧へ
新着記事
New1
Play Framework
Play Frameworkでクッキーを守る!Secure属性とHttpOnly属性の設定方法を徹底解説
New2
Play Framework
マイクロサービス時代におけるPlay Frameworkの位置付けを徹底解説!初心者でもわかる最新Javaフレームワークの役割
New3
Play Framework
Play Frameworkとは?特徴と歴史を初心者向けにわかりやすく解説
New4
Jakarta EE
Jakarta EEのServletフィルタとは?仕組みと役割を初心者向けにやさしく解説
人気記事
No.1
Java&Spring記事人気No1
Jakarta EE
Jakarta EEとJava EEアプリの互換性を完全解説!移行で困らないための基礎知識
No.2
Java&Spring記事人気No2
Jakarta EE
Jakarta サーブレットのdoGetとdoPostの違いと使い分けを徹底解説!初心者でもわかるHTTPリクエスト処理
No.3
Java&Spring記事人気No3
Jakarta EE
Jakarta EEとは?Java EEからの移行の歴史をやさしく解説
No.4
Java&Spring記事人気No4
Jakarta EE
Jakarta EE JAX-RSインターセプタの仕組みを完全解説 初心者でも理解できるReaderInterceptorとWriterInterceptorの使い方
No.5
Java&Spring記事人気No5
Play Framework
Play Frameworkでセッション管理と認証を連携!Java初心者向けログイン実装ガイド
No.6
Java&Spring記事人気No6
Play Framework
Play Frameworkのセッション固定攻撃対策!Javaで安全なログイン機能を実装する方法
No.7
Java&Spring記事人気No7
Jakarta EE
Jakarta EEを支えるEclipse Foundationの役割とは?初心者向けにわかりやすく解説
No.8
Java&Spring記事人気No8
Jakarta EE
Jakarta EE JSON-PとJSON-Bの違いと役割を徹底解説 初心者でも理解できるJSON処理の基本