カテゴリ: Flask 更新日: 2025/12/20

Flaskで認証の状態を保持する方法!クライアント側との違いを初心者にもわかりやすく解説

Flaskで認証の状態を保持する方法!クライアント側との違いを理解
Flaskで認証の状態を保持する方法!クライアント側との違いを理解

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

生徒

「先生、Flaskでログイン機能を作ったんですが、ページを移動するとログイン状態が消えてしまうんです。」

先生

「それは“認証状態を保持”していないからですね。Flaskでは、ログイン情報を一時的に保存しておく仕組みが必要なんです。」

生徒

「なるほど…。でも、どうやってログイン状態を覚えさせるんですか?」

先生

「Flaskでは“セッション(Session)”という仕組みを使って、認証状態を保持できます。今日はその仕組みと、クライアント側での保存との違いも一緒に学びましょう。」

1. Flaskでの「認証状態を保持する」とは?

1. Flaskでの「認証状態を保持する」とは?
1. Flaskでの「認証状態を保持する」とは?

まず、「認証状態を保持する」というのは、ユーザーが一度ログインしたあと、他のページに移動してもログイン情報を維持することです。もしこの仕組みがないと、ページを開くたびに毎回パスワードを入力する必要があり、とても不便ですよね。

この認証状態をFlaskで管理するための中心的な仕組みが「セッション」です。Flaskのセッションを使うと、ユーザーごとにログイン中かどうかを簡単に判定できます。

2. Flaskのセッションとは?

2. Flaskのセッションとは?
2. Flaskのセッションとは?

セッション(Session)とは、サーバー側でユーザーごとの一時的な情報を保存する仕組みです。Flaskでは、sessionという変数を使って、ユーザー情報を保存できます。

セッションは、ユーザーのブラウザに保存される「Cookie(クッキー)」と連動して動作します。クッキーとは、Webサイトがユーザーのパソコンに保存する小さなデータのことです。

Flaskでは、Cookieにセッションの鍵となるIDを保存し、実際のデータはサーバー側で安全に管理します。

3. Flaskでセッションを使って認証状態を保持する方法

3. Flaskでセッションを使って認証状態を保持する方法
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. クライアント側での認証保持との違い

4. クライアント側での認証保持との違い
4. クライアント側での認証保持との違い

セッションの反対に「クライアント側」で認証状態を保持する方法もあります。クライアント側とは、ユーザーのブラウザやパソコンのことです。

たとえば、Cookieに「ログイン済み」という情報を直接保存する方法もあります。しかし、これはセキュリティ的に非常に危険です。悪意のあるユーザーがCookieを改ざんすると、なりすましログインができてしまうからです。

そのため、Flaskでは「サーバー側」でデータを管理し、「クライアント側」には安全なトークン(鍵)だけを渡すという構造になっています。


<!-- クライアント側に保存されるCookieのイメージ -->
session_id=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9;

このように、ブラウザ側にはセッションIDという暗号化された文字列だけが保存され、実際のユーザー情報はFlask側で管理されます。

5. セッションを使うときの注意点

5. セッションを使うときの注意点
5. セッションを使うときの注意点

セッションはとても便利ですが、使い方を誤ると危険です。以下のポイントに注意しましょう。

  • 秘密鍵(secret_key)は絶対に公開しない:GitHubなどにアップロードすると危険です。
  • HTTPS通信を使う:Cookieが盗まれるのを防ぐため、暗号化通信を有効にしましょう。
  • セッションの有効期限を設定する:長時間放置されたセッションを自動で無効化します。

from datetime import timedelta

app.permanent_session_lifetime = timedelta(minutes=30)  # 有効期限30分

この設定を追加すると、セッションが30分経過すると自動的に無効になります。安全性を高めるために必須の設定です。

6. Flaskでのサーバー側とクライアント側の関係をイメージで理解しよう

6. Flaskでのサーバー側とクライアント側の関係をイメージで理解しよう
6. Flaskでのサーバー側とクライアント側の関係をイメージで理解しよう

初心者の方は、「サーバー」と「クライアント」の関係をイメージするのが難しいかもしれません。簡単にたとえると、こんな感じです。

・サーバー:レストランのキッチン(料理を作る場所)
・クライアント:お客さんのテーブル(注文を受け取る場所)

セッションは「誰がどのテーブルのお客さんか」を記録するメモのようなものです。このメモがあるおかげで、ウェイター(Flask)は「このお客さんはさっきログインした人だな」と判断できます。

この仕組みによって、ページを移動してもログイン状態が維持されるわけです。

7. まとめ:セッションで安全に認証状態を保持しよう

7. まとめ:セッションで安全に認証状態を保持しよう
7. まとめ:セッションで安全に認証状態を保持しよう

Flaskで認証状態を保持するには、セッションを使うのが基本です。クライアント側に情報を保存せず、サーバー側で管理することで安全にログイン状態を維持できます。

この考え方は、Flaskだけでなく他のWebフレームワークでも共通しています。まずは今回のサンプルを動かして、実際にセッションの仕組みを体験してみましょう。

カテゴリの一覧へ
新着記事
New1
Flask
Flaskのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
New2
Flask
FlaskでOAuth2認証を完全解説!初心者でも理解できる安全なログインの仕組み
New3
Flask
FlaskアプリをNginx + Gunicornで本番運用する方法!初心者でもわかるデプロイ構成の基本
New4
Flask
Flaskでフォームとデータベースを連携する方法を初心者向けに解説!Pythonで簡単Webアプリ開発
人気記事
No.1
Java&Spring記事人気No1
Flask
Flask-Loginでユーザー認証を完全ガイド!初心者でもわかるログイン処理の作り方
No.2
Java&Spring記事人気No2
Django
Django環境構築の全手順を完全解説!初心者でも迷わないPython・Djangoセットアップガイド
No.3
Java&Spring記事人気No3
Python
Pythonの文字列を1文字ずつ処理する方法!for文やlist化の活用例
No.4
Java&Spring記事人気No4
Python
PythonでHello Worldを表示するには?初心者向けに最初の1行を実行してみよう
No.5
Java&Spring記事人気No5
Python
Pythonの文字列から一部を抽出する方法!スライスを使った基本的な切り出し方
No.6
Java&Spring記事人気No6
Python
Pythonでリストを文字列に変換する方法を完全ガイド!初心者でもわかるjoinの使い方
No.7
Java&Spring記事人気No7
Python
Pythonのmatch文(パターンマッチング)とは?switch文の代替としての使い方をやさしく解説
No.8
Java&Spring記事人気No8
Flask
FlaskアプリをNginx + Gunicornで本番運用する方法!初心者でもわかるデプロイ構成の基本