Flaskで認証の状態を保持する方法!クライアント側との違いを初心者にもわかりやすく解説
生徒
「先生、Flaskでログイン機能を作ったんですが、ページを移動するとログイン状態が消えてしまうんです。」
先生
「それは“認証状態を保持”していないからですね。Flaskでは、ログイン情報を一時的に保存しておく仕組みが必要なんです。」
生徒
「なるほど…。でも、どうやってログイン状態を覚えさせるんですか?」
先生
「Flaskでは“セッション(Session)”という仕組みを使って、認証状態を保持できます。今日はその仕組みと、クライアント側での保存との違いも一緒に学びましょう。」
1. Flaskでの「認証状態を保持する」とは?
まず、「認証状態を保持する」というのは、ユーザーが一度ログインしたあと、他のページに移動してもログイン情報を維持することです。もしこの仕組みがないと、ページを開くたびに毎回パスワードを入力する必要があり、とても不便ですよね。
この認証状態をFlaskで管理するための中心的な仕組みが「セッション」です。Flaskのセッションを使うと、ユーザーごとにログイン中かどうかを簡単に判定できます。
2. Flaskのセッションとは?
セッション(Session)とは、サーバー側でユーザーごとの一時的な情報を保存する仕組みです。Flaskでは、sessionという変数を使って、ユーザー情報を保存できます。
セッションは、ユーザーのブラウザに保存される「Cookie(クッキー)」と連動して動作します。クッキーとは、Webサイトがユーザーのパソコンに保存する小さなデータのことです。
Flaskでは、Cookieにセッションの鍵となるIDを保存し、実際のデータはサーバー側で安全に管理します。
3. Flaskでセッションを使って認証状態を保持する方法
それでは、実際にFlaskでセッションを使ってログイン状態を保持するサンプルを見てみましょう。
from flask import Flask, session, redirect, url_for, request, render_template_string
app = Flask(__name__)
app.secret_key = 'secret_key_1234' # セッションを暗号化するための秘密鍵
@app.route('/')
def home():
# ログイン状態を確認
if 'username' in session:
return f"ようこそ、{session['username']}さん!"
return "ログインしていません。<a href='/login'>ログインページへ</a>"
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
session['username'] = username # セッションに保存(ログイン状態を保持)
return redirect(url_for('home'))
return render_template_string('''
<form method="post">
ユーザー名:<input name="username"><br>
<input type="submit" value="ログイン">
</form>
''')
@app.route('/logout')
def logout():
session.pop('username', None) # セッション削除(ログアウト)
return redirect(url_for('home'))
このサンプルでは、ログイン後にユーザー名をセッションに保存しています。session['username']が存在する間は「ログイン中」と判断できます。
4. クライアント側での認証保持との違い
セッションの反対に「クライアント側」で認証状態を保持する方法もあります。クライアント側とは、ユーザーのブラウザやパソコンのことです。
たとえば、Cookieに「ログイン済み」という情報を直接保存する方法もあります。しかし、これはセキュリティ的に非常に危険です。悪意のあるユーザーがCookieを改ざんすると、なりすましログインができてしまうからです。
そのため、Flaskでは「サーバー側」でデータを管理し、「クライアント側」には安全なトークン(鍵)だけを渡すという構造になっています。
<!-- クライアント側に保存されるCookieのイメージ -->
session_id=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9;
このように、ブラウザ側にはセッションIDという暗号化された文字列だけが保存され、実際のユーザー情報はFlask側で管理されます。
5. セッションを使うときの注意点
セッションはとても便利ですが、使い方を誤ると危険です。以下のポイントに注意しましょう。
- 秘密鍵(secret_key)は絶対に公開しない:GitHubなどにアップロードすると危険です。
- HTTPS通信を使う:Cookieが盗まれるのを防ぐため、暗号化通信を有効にしましょう。
- セッションの有効期限を設定する:長時間放置されたセッションを自動で無効化します。
from datetime import timedelta
app.permanent_session_lifetime = timedelta(minutes=30) # 有効期限30分
この設定を追加すると、セッションが30分経過すると自動的に無効になります。安全性を高めるために必須の設定です。
6. Flaskでのサーバー側とクライアント側の関係をイメージで理解しよう
初心者の方は、「サーバー」と「クライアント」の関係をイメージするのが難しいかもしれません。簡単にたとえると、こんな感じです。
・サーバー:レストランのキッチン(料理を作る場所)
・クライアント:お客さんのテーブル(注文を受け取る場所)
セッションは「誰がどのテーブルのお客さんか」を記録するメモのようなものです。このメモがあるおかげで、ウェイター(Flask)は「このお客さんはさっきログインした人だな」と判断できます。
この仕組みによって、ページを移動してもログイン状態が維持されるわけです。
7. まとめ:セッションで安全に認証状態を保持しよう
Flaskで認証状態を保持するには、セッションを使うのが基本です。クライアント側に情報を保存せず、サーバー側で管理することで安全にログイン状態を維持できます。
この考え方は、Flaskだけでなく他のWebフレームワークでも共通しています。まずは今回のサンプルを動かして、実際にセッションの仕組みを体験してみましょう。