FlaskでCookieを安全に使う方法!HttpOnly・Secureフラグの使い方を徹底解説
生徒
「Flaskでログイン情報をCookieに保存したいんですが、安全に扱うにはどうしたらいいんですか?」
先生
「Cookieはとても便利ですが、使い方を間違えると危険です。『HttpOnly』や『Secure』という設定を使えば、安全に保つことができますよ。」
生徒
「その2つって、どんな効果があるんですか?全然わかりません…」
先生
「では、Cookieとは何かから始めて、順を追って丁寧に解説しましょう!」
1. Cookie(クッキー)とは?
Cookie(クッキー)とは、Webサイトがあなたのパソコンやスマホの中に、小さなメモのような情報を保存しておく仕組みです。たとえば「ログイン状態を保つ」「前回見たページを記録する」「ショッピングカートの中身を覚えておく」など、ユーザーが快適に利用できるようにするために多くのサイトで使われています。
仕組みとしてはとてもシンプルで、Webサイトからブラウザ(ChromeやSafariなど)に向けて「この情報を保存しておいてね」と送るだけ。次回アクセスしたとき、ブラウザはその情報をサーバーへ送り返すことで、同じ状態を再現できます。これによって、毎回ログイン情報を入力する手間がなくなったり、個別に設定した内容を覚えておいてくれたりします。
しかし、この便利なCookieにも注意点があります。悪意のある人にCookieが盗まれてしまうと、勝手にログインされる・個人情報が不正に使われるといったトラブルにつながることがあります。そのため、Cookieを扱うときは安全な設定をすることがとても重要です。
まずは、どのようにブラウザへ保存されるのかを簡単なサンプルで見てみましょう。
from flask import Flask, make_response
app = Flask(__name__)
@app.route("/set")
def set_cookie():
response = make_response("Cookieを保存しました!")
response.set_cookie("username", "taro") # シンプルなCookieの例
return response
# /set にアクセスすると、ブラウザに Cookie(username=taro) が保存されます
このように、Cookieはほんの数行のコードで簡単に扱えます。ただし、後で説明するようにセキュリティ対策をしないまま使うのはとても危険です。まずはCookieの正体をしっかり理解しておくことが、安全にWebアプリを作る第一歩になります。
2. FlaskでCookieを使う基本の書き方
ここでは、FlaskでCookieを扱うときの基本的な流れを、初心者の方にもわかりやすいように丁寧に説明します。Cookieは「サーバーから渡したい小さなメモ」のようなものなので、まずはそのメモを書き込む作業が必要です。Flaskでは、make_responseという関数を使ってレスポンス(サーバーからブラウザに返す内容)を作り、その中にCookieを追加します。
次のシンプルなサンプルでは、アクセスしたユーザーに対して「username」という名前のCookieを保存しています。これを使うことで、次回アクセス時に「同じ人が来たかどうか」を判別できるようになります。
from flask import Flask, request, make_response
app = Flask(__name__)
@app.route('/')
def index():
# ブラウザへ返すレスポンスを作成
response = make_response("こんにちは!Cookieを保存しました。")
# Cookieに 'username=taro' を保存
response.set_cookie('username', 'taro')
return response
# ブラウザで / にアクセスすると、username=taro のCookieが保存されます
このコードを実行してブラウザからアクセスすると、目に見える変化はありませんが、裏側でブラウザにCookieが確実に保存されています。Cookieは画面に表示されるものではなく、あくまでブラウザ内部に記録されるデータです。
このように、Cookieはわずか数行のコードで簡単に使い始めることができます。次のステップでは、より安全に扱うための設定も必要になりますが、まずは「レスポンスを作り、そこにCookieを付けて返す」という基本の流れをしっかり覚えておくと、今後の理解がずっとスムーズになります。
3. HttpOnlyとは何か?なぜ必要なの?
HttpOnly(エイチティーティーピー・オンリー)とは、「JavaScriptからこのCookieを読めなくする」というためのフラグ(設定項目)です。少し硬い表現に聞こえますが、イメージとしては「このCookieはサーバーとの通信だけで使ってね、画面側のスクリプトからは触らせないでね」という札を立てるようなものだと思ってください。
普通、Webページの中ではJavaScriptというプログラムが動いており、ブラウザに保存されているCookieの値を読むこともできます。もし悪意のあるスクリプトがページの中に紛れ込んでしまうと、ログイン情報が入ったCookieを勝手に読み取られて、なりすましログインなどの被害につながる可能性があります。こうしたリスクを減らすために使うのがHttpOnlyフラグです。
FlaskでHttpOnlyを有効にしたCookieを設定したい場合は、set_cookie()にhttponly=Trueという引数を追加するだけです。実際のコード例を見てみましょう。
from flask import Flask, make_response
app = Flask(__name__)
@app.route("/login")
def login():
response = make_response("ログインしました!")
# JavaScriptからはアクセスできない、安全性を高めたCookie
response.set_cookie("session_id", "abc123", httponly=True)
return response
# /login にアクセスすると、HttpOnly付きの session_id がブラウザに保存されます
このようにhttponly=Trueをつけておくと、ブラウザ内部ではCookieとして利用できる一方で、ページ内のJavaScriptからはこのCookieの中身を直接読むことができなくなります。特に、ログイン状態を表すセッションIDなどの重要な情報を扱うときは、必ずHttpOnlyを付けておくことが安全なFlaskアプリ開発の基本ルールになります。
4. Secureフラグとは?安全な通信のために
Secure(セキュア)フラグとは、「HTTPSでアクセスしているときだけ、このCookieを送信してね」とブラウザに指示するための設定です。HTTPSとは、URLが「https://」で始まる暗号化された通信のことで、ログインページなど多くのWebアプリで標準的に使われています。
逆に、暗号化されていないHTTP通信では、途中で通信内容を盗み見られてしまう可能性があります。そのときにCookieの中にログイン情報やセッションIDが入っていると、それを盗まれてなりすましログインをされる危険があります。そこで「Secureフラグを付けたCookieは、HTTPSのときだけ送る」というルールにしておくと、安全性を高めることができます。
FlaskでSecureフラグを付けたい場合は、set_cookie()にsecure=Trueを付けるだけです。次のようなイメージになります。
from flask import Flask, make_response
app = Flask(__name__)
@app.route("/secure-login")
def secure_login():
response = make_response("安全な接続でログインしました。")
# HTTPS 通信のときだけ送信される Cookie
response.set_cookie("session_id", "secure123", secure=True)
return response
# 本番環境では https:// でアクセスし、Secure付きCookieを送信します
ローカル開発ではHTTPで動かすことも多いですが、インターネット上に公開する本番環境では、HTTPS+Secureフラグを組み合わせて使うのが定番です。大事な情報を守るためにも、「ログイン関連のCookieにはSecureを必ず付ける」という習慣をつけておきましょう。
5. HttpOnlyとSecureを両方つける
セキュリティを高めるには、HttpOnlyとSecureを両方つけるのが基本です。Flaskでは次のように書けます。
response.set_cookie('username', 'taro', httponly=True, secure=True)
たったこれだけで、Cookieのセキュリティをグッと高めることができます。
6. Cookieの有効期限を設定しよう
Cookieには、いつまで使えるかという「有効期限(expire)」を設定することができます。例えば、ログイン状態を1時間だけ保ちたい場合には、次のように書きます。
import datetime
expire_time = datetime.datetime.now() + datetime.timedelta(hours=1)
response.set_cookie('username', 'taro', expires=expire_time, httponly=True, secure=True)
これで、1時間後には自動的にCookieが使えなくなります。ログアウトのような動きになります。
7. Cookieの中にパスワードなどを入れない
最後に、とても大切な注意点です。Cookieの中にパスワードや個人情報をそのまま入れてはいけません。どれだけSecureやHttpOnlyを使っても、見られるリスクはゼロにはなりません。
Cookieは、「トークン」や「セッションID」のようなものを入れて、サーバー側で情報を管理するのが安全な方法です。
まとめ
FlaskでCookieを安全に扱うためには、ただ単に値を保存するだけではなく、Cookieの働きや仕組みを深く理解したうえで、適切な設定を行うことがとても重要になります。とくに、HttpOnlyやSecureといったフラグは、初心者が見落としやすいポイントでありながら、セキュリティを高めるうえで欠かせない仕組みです。Cookieはとても便利で、多くのWebアプリでログイン情報や一時的なデータ保持に使われていますが、それと同時に悪意のある第三者に狙われやすい側面も持っています。こうした構造的なリスクを踏まえて、正しく設定を行うことが安全なアプリケーション運用の基盤となります。 とくにHttpOnlyは、ブラウザ内で動くJavaScriptからCookieを読み取れなくすることで、XSS攻撃などによる情報の抜き取りを防ぐ役割があります。Webページには多くのスクリプトが埋め込まれることがあり、その中に不正なコードが紛れ込む可能性もゼロではありません。そこでHttpOnlyを付けることで、スクリプトから重要なCookieが見えなくなり、ログイン情報を守る大きな盾となります。また、SecureフラグはCookieをHTTPS通信でのみ送信する設定で、暗号化されないHTTP通信での盗聴や改ざんからCookieを保護します。特に公開されたWebサービスを運用する場合、Secureフラグを設定することで、通信路を狙った攻撃から大切なユーザー情報を守ることにつながります。 さらに、Cookieの有効期限を正しく設定することで、長期間にわたり保存されてしまうリスクも軽減できます。ログイン状態を維持し過ぎると、第三者に端末を触られたときにそのまま不正アクセスされる危険があります。そのため、有効期限を短めに設定する、または用途に応じて適切な期間に調整することが大切です。加えて、Cookieにはパスワードや個人情報を直接保存してはいけないという基本的なルールも忘れてはいけません。サーバー側でユーザー情報を管理し、CookieにはセッションIDやトークンだけを入れる形にしておくことが安全性を高めるうえで非常に効果的です。 こうしたCookieに関する基本的な知識を丁寧に理解することで、Webアプリ全体の安全性は大きく向上します。Flaskのような軽量なフレームワークは自由度が高い反面、開発者が細かい部分まで意識しなければならない側面もあります。だからこそ、今回学んだHttpOnlyやSecureの設定、さらに有効期限の管理やCookie設計の考え方をしっかり身につけることが、安全なWebアプリを作るうえでの大きな一歩になります。 また、日常的にセキュリティについて意識する習慣を身につけることも大切です。とくにCookieのようにユーザーの情報に近いデータを扱う機能では、設定ひとつの違いが安全性を大きく左右します。初心者であっても、今回学んだ内容を少しずつ取り入れながら開発を行うことで、より確実で信頼性の高いアプリケーションを構築できるようになります。小さな工夫が大きな安心につながることを忘れずに、着実に実践していきましょう。
サンプルプログラムまとめ
ここでは、今回学んだCookieの安全な使い方を反映したサンプルコードをまとめています。
from flask import Flask, make_response
import datetime
app = Flask(__name__)
@app.route("/set_safe_cookie")
def set_safe_cookie():
expire_at = datetime.datetime.now() + datetime.timedelta(hours=1)
response = make_response("安全なCookieを設定しました!")
response.set_cookie(
"session_token",
"example_token_value",
httponly=True,
secure=True,
expires=expire_at
)
return response
@app.route("/read_cookie")
def read_cookie():
# HttpOnlyのためJavaScriptからは読み取れず、安全性が高まります
return "Cookieはサーバー側で安全に扱われています。"
生徒「Cookieってただ保存するだけだと思っていましたが、設定次第でこんなに安全性が変わるんですね…!」
先生「その通りです。便利な仕組みほど、しっかり守る必要があります。HttpOnlyやSecureは特に大切ですよ。」
生徒「確かに、JavaScriptから読み取られないようにしたり、HTTPS通信だけで送るようにするのは安心ですね。」
先生「ええ、そしてCookieには個人情報を直接入れず、セッションIDなどに留めることも大切です。」
生徒「はい!これからFlaskでCookieを扱うときは、今日のポイントを必ず意識して作ります!」
先生「その意識が何より大切です。安全なアプリ作りを続けていきましょう。」