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

認証と認可の違いを整理しよう!Flaskで押さえるべき基礎概念

認証と認可の違いを整理しよう!Flaskで押さえるべき基礎概念
認証と認可の違いを整理しよう!Flaskで押さえるべき基礎概念

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

生徒

「先生、Flaskでログイン機能を作ろうとしてるんですが、“認証”と“認可”の違いがよくわかりません。」

先生

「とても良い質問ですね。認証と認可は似ているようで、実は役割がまったく違うんです。簡単に言うと、『誰なのか確認する』のが認証で、『何ができるか決める』のが認可です。」

生徒

「なるほど…!でも、それってFlaskのアプリではどう関係してくるんですか?」

先生

「いい質問ですね。Flaskでログイン機能を作るとき、この2つの考え方をきちんと分けて設計しないと、セキュリティに問題が起きてしまうんです。では、順を追って説明していきましょう。」

1. Flaskにおける「認証」とは?

1. Flaskにおける「認証」とは?
1. Flaskにおける「認証」とは?

まず「認証(Authentication)」とは、 アクセスしてきたユーザーが本当に本人かどうかを確認する仕組みのことです。 Webサイトでログインするときに入力する、 ユーザー名やメールアドレス、パスワードを使って、 サーバー側が「この人は登録済みのユーザーか?」を判断します。 この本人確認の処理が、認証の役割になります。

身近な例で考えると、認証は「会員証を見せて入店する」行為に近いです。 会員証を提示して初めて、 「この人は会員だ」と認めてもらえますよね。 Flaskでも同じように、 正しい情報を持っているユーザーだけを ログイン状態として扱います。

Flaskで認証を行う場合、 よく使われるのが「セッション(Session)」という仕組みです。 セッションは、 「このユーザーはすでにログイン済みですよ」 という情報をサーバー側で一時的に覚えておくための箱のようなものです。 これにより、ページを移動してもログイン状態を保てます。


from flask import Flask, session

app = Flask(__name__)
app.secret_key = "secret_key"

@app.route("/login")
def login():
    # 認証に成功したと仮定してユーザー名を保存
    session["user"] = "taro"
    return "ログインしました"

@app.route("/profile")
def profile():
    if "user" in session:
        return f"{session['user']}さんのプロフィールページです"
    return "ログインしてください"

この簡単な例では、 session["user"]が存在するかどうかで、 「ログイン済みかどうか」を判断しています。 これがFlaskにおける認証の基本的な考え方です。 まずは「認証=誰かを確認する処理」という点を、 しっかり押さえておきましょう。

2. Flaskでのセッションを使った認証の例

2. Flaskでのセッションを使った認証の例
2. Flaskでのセッションを使った認証の例

ここでは、Flaskでよく使われる「セッション」を使った認証の流れを、 できるだけシンプルな例で確認してみましょう。 セッション認証のポイントは、 ログインに成功したあと、ユーザー情報をサーバー側に一時保存する という点にあります。

ユーザーがログインフォームに入力した情報をFlaskが受け取り、 条件に合っていれば「ログイン済み」と判断します。 その状態を覚えておくために使われるのがセッションです。 セッションを使うことで、 ページを移動しても「誰がログインしているか」を判別できるようになります。


from flask import Flask, session, redirect, url_for, request

app = Flask(__name__)
app.secret_key = "secret_key"  # セッションを使うために必須

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        # パスワードが正しいかを確認(簡略化した例)
        if request.form['password'] == 'python':
            # 認証に成功したらユーザー名をセッションに保存
            session['user'] = request.form['username']
            return redirect(url_for('mypage'))
        return "ログイン失敗!"
    return '''
        <form method="post">
            ユーザー名: <input type="text" name="username"><br>
            パスワード: <input type="password" name="password"><br>
            <input type="submit" value="ログイン">
        </form>
    '''

@app.route('/mypage')
def mypage():
    if 'user' in session:
        return f"{session['user']}さん、ようこそ!"
    return redirect(url_for('login'))

if __name__ == '__main__':
    app.run(debug=True)

この例では、ログインに成功すると session['user']にユーザー名が保存されます。 その後、/mypageにアクセスしたとき、 セッションの中にユーザー情報があれば、 「ログイン済み」と判断してページを表示しています。

重要なのは、 パスワードそのものをセッションに保存していない点です。 セッションには「ログインしている事実」だけを持たせることで、 安全性を保ちながら認証を実現できます。 これがFlaskにおける、 セッションを使った基本的な認証の考え方です。

3. 「認可」とは?何ができるかを決める仕組み

3. 「認可」とは?何ができるかを決める仕組み
3. 「認可」とは?何ができるかを決める仕組み

次に理解しておきたいのが「認可(Authorization)」です。 認可とは、 認証が終わったあと、そのユーザーにどこまでの操作を許可するかを決める仕組み のことを指します。 つまり、「ログインできるかどうか」ではなく、 「ログイン後に何ができるか」を制御する役割を持っています。

たとえば、同じWebサービスにログインしていても、 管理者と一般ユーザーでは使える機能が異なります。 管理者は設定画面やユーザー管理画面に入れますが、 一般ユーザーは閲覧や簡単な操作だけに制限されていることが多いですよね。 この違いを実現しているのが認可です。

身近な例で言うと、 「建物に入れるかどうか」が認証だとすれば、 「どの部屋に入れるか」が認可にあたります。 家の中に入れるのは家族だけ(認証)ですが、 金庫や書斎に入れるのは特定の人だけ(認可)というイメージです。


from flask import Flask, session

app = Flask(__name__)
app.secret_key = "secret_key"

@app.route("/login_admin")
def login_admin():
    # 管理者としてログインしたと仮定
    session["role"] = "admin"
    return "管理者としてログインしました"

@app.route("/dashboard")
def dashboard():
    if session.get("role") == "admin":
        return "管理者用ダッシュボードです"
    return "このページにアクセスする権限がありません"

この簡単な例では、 セッションに保存された role(権限情報)を使って、 管理者だけが特定のページにアクセスできるようにしています。 このように、 認可は「条件分岐」で制御されることが多く、 認証とは別の視点で設計することが重要です。

まずは、 「認可=操作や画面へのアクセス範囲を決める仕組み」 という考え方をしっかり理解しておきましょう。

4. Flaskで簡単な認可を実装してみよう

4. Flaskで簡単な認可を実装してみよう
4. Flaskで簡単な認可を実装してみよう

ここでは、Flaskで「認可」をどのように実装するのかを、 初心者の方にも分かりやすい形で見ていきましょう。 認可の基本はとてもシンプルで、 ログイン中のユーザーが持っている権限情報を確認し、アクセス可否を判断する という考え方になります。

Flaskでは、セッションに「role(役割・権限)」を保存しておき、 ページにアクセスされたタイミングでその値をチェックする方法がよく使われます。 たとえば「admin」という権限を持つユーザーだけが、 管理画面に入れるようにする、といった制御です。


from flask import Flask, session, redirect, url_for

app = Flask(__name__)
app.secret_key = "secret_key"

@app.route('/login/<role>')
def login(role):
    # ログイン時に権限をセッションへ保存
    session['role'] = role
    return f"{role}としてログインしました"

@app.route('/admin')
def admin():
    # 権限をチェックしてアクセス制御
    if session.get('role') == 'admin':
        return "管理者ページです。ようこそ!"
    return redirect(url_for('login', role='user'))

この例では、ログイン時に session['role']へ権限情報を保存しています。 そして、管理ページにアクセスした際、 その値が「admin」であれば表示を許可し、 それ以外の場合は別のページへリダイレクトしています。

このように、認可は 「条件に合う人だけ処理を進める」 という考え方で実装されることが多く、 if文を使った分岐が基本になります。 認証と組み合わせることで、 より安全で実用的なWebアプリを作れるようになります。

5. 認証と認可を混同しないことが大切

5. 認証と認可を混同しないことが大切
5. 認証と認可を混同しないことが大切

認証と認可はどちらもログイン機能に関係しますが、目的がまったく違います。

  • 認証(Authentication)=「あなたは誰?」を確認する
  • 認可(Authorization)=「あなたは何ができる?」を決める

Flaskのアプリを安全に作るためには、この2つを正しく分けて考えることが非常に重要です。もし認可を設定し忘れると、一般ユーザーが管理ページにアクセスできてしまうなど、大きなセキュリティ事故につながります。

6. Flaskで安全な認証・認可を行うためのポイント

6. Flaskで安全な認証・認可を行うためのポイント
6. Flaskで安全な認証・認可を行うためのポイント

最後に、Flaskで安全なログインシステムを作るための注意点をまとめておきましょう。

  • パスワードは必ずハッシュ化して保存する(生のまま保存しない)
  • セッションに重要な情報(パスワードなど)を保存しない
  • Flaskの拡張機能「Flask-Login」や「Flask-Security」を活用する
  • アクセス制御(認可)をデコレーター関数で管理すると便利

これらを意識することで、FlaskのWebアプリケーションは格段に安全になります。特に「Flask-Login」は認証の仕組みを簡単に構築できる便利な拡張機能です。

7. 実際のサービスではどう使われている?

7. 実際のサービスではどう使われている?
7. 実際のサービスではどう使われている?

実際のWebサービスでも、認証と認可はさまざまな形で使われています。たとえば:

  • TwitterやGoogleのログイン(OAuth認証)
  • 会員サイトでのログイン機能(セッション認証)
  • 管理者専用ページの制限(認可制御)

こうした仕組みをFlaskで再現できるようになると、実際のWebアプリ開発にも応用できるようになります。まずは、今回紹介した基本的な概念をしっかり理解するところから始めましょう。

まとめ

まとめ
まとめ

認証と認可の基本を振り返ろう

この記事では、Flaskでログイン機能を実装するうえで欠かせない「認証」と「認可」の違いについて、基礎から丁寧に整理してきました。 認証は「その人が誰なのか」を確認する仕組みであり、ログイン処理そのものを指します。 一方で認可は、ログイン後に「どこまで操作してよいか」「どの画面にアクセスできるか」を制御する仕組みです。 この二つは似ているようで役割が明確に異なり、FlaskのWebアプリを安全に作るためには必ず分けて考える必要があります。

Flaskでは、セッションを使って認証状態や権限情報を管理する方法がよく使われます。 セッションにユーザー名を保存することでログイン状態を維持し、 さらに役割や権限を表す値を持たせることで、管理者専用ページや一般ユーザー向け画面を切り分けられます。 こうした基本的な仕組みを理解しておくことで、ログイン機能付きのWebアプリ開発がぐっと現実的になります。

シンプルな認証と認可の流れを確認

ここで、この記事で学んだ内容をまとめた、非常にシンプルなサンプルを見てみましょう。 認証でユーザーを判別し、その後に認可でアクセス制御を行う、という基本的な流れを確認できます。


from flask import Flask, session, redirect, url_for

app = Flask(__name__)
app.secret_key = "secret_key"

@app.route('/login')
def login():
    # 認証:ログイン成功と仮定
    session['user'] = 'taro'
    session['role'] = 'user'
    return "ログインしました"

@app.route('/admin')
def admin():
    # 認可:管理者だけアクセス可能
    if session.get('role') == 'admin':
        return "管理者ページです"
    return "アクセス権限がありません"

@app.route('/logout')
def logout():
    session.clear()
    return "ログアウトしました"

このように、認証では「誰がログインしているか」を判断し、 認可では「その人が何をできるか」を条件分岐で制御します。 たとえ小さなサンプルコードであっても、 認証と認可を意識して分けて実装することで、 後から機能を追加しやすく、安全性も保ちやすくなります。

先生と生徒の振り返り会話

生徒

「最初は認証と認可って同じようなものだと思っていましたが、 ログインできるかどうかと、できる操作を分けて考える必要があるってよく分かりました。」

先生

「そうですね。特にFlaskのような軽量なフレームワークでは、 自分で設計を意識しないと、認可を忘れてしまいがちです。 そこが初心者の方がつまずきやすいポイントでもあります。」

生徒

「セッションに何でも入れてしまいそうでしたが、 必要最低限の情報だけを持たせるのが大事なんですね。」

先生

「その通りです。認証と認可を正しく分けて考えられるようになると、 FlaskでのWebアプリ開発が一段レベルアップします。 まずは基本をしっかり身につけていきましょう。」

今回学んだ認証と認可の基礎は、 Flaskだけでなく、他のWebフレームワークや実際のサービス開発でも共通して使われる重要な考え方です。 まずは小さなアプリで試しながら、 安全なログイン機能の設計に慣れていくことをおすすめします。

カテゴリの一覧へ
新着記事
New1
Django
Djangoプロジェクトのディレクトリ構造を完全解説!初心者でも迷わないフォルダの見方
New2
Flask
Flask×Flask-SocketIOでチャットアプリを作る流れを初心者向けにやさしく解説
New3
Flask
Flaskアプリの作り方を基礎から学ぼう!初心者が覚えるべき開発の流れとは?
New4
Flask
Flask-WTFでファイルアップロードフォームを完全ガイド!初心者でもわかる画像やPDFのアップロード方法
人気記事
No.1
Java&Spring記事人気No1
Django
Django環境構築の全手順を完全解説!初心者でも迷わないPython・Djangoセットアップガイド
No.2
Java&Spring記事人気No2
Flask
Flask-Loginでユーザー認証を完全ガイド!初心者でもわかるログイン処理の作り方
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
Flask
FlaskアプリをNginx + Gunicornで本番運用する方法!初心者でもわかるデプロイ構成の基本
No.8
Java&Spring記事人気No8
Python
Pythonのmatch文(パターンマッチング)とは?switch文の代替としての使い方をやさしく解説