[파이썬] Flask에서의 SSO (Single Sign-On)

개요

SSO (Single Sign-On)는 사용자가 단일 인증 정보로 여러 시스템에 접속할 수 있는 인증 메커니즘입니다. Flask는 Python으로 작성된 웹 프레임워크로서 SSO를 구현하기에 적합한 환경을 제공합니다. 이 블로그 포스트에서는 Flask 애플리케이션에서 SSO 구현하는 방법을 알아보겠습니다.

세션 기반 SSO

세션 기반 SSO는 사용자가 한 번 로그인하면 여러 시스템에서 회원 인증 정보를 공유하는 방식입니다. Flask에서는 세션을 쉽게 관리할 수 있는 Flask-Session 확장을 사용할 수 있습니다.

Flask-Session 설치

pip install Flask-Session

Flask-Session 구성

app.py 파일에서 app 객체 생성 및 Flask-Session 확장 초기화 코드를 추가합니다.

from flask import Flask, session
from flask_session import Session

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
app.config['SESSION_TYPE'] = 'filesystem'

Session(app)

로그인 기능 구현

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')

        # 사용자 인증 로직

        # 인증이 성공하면 세션에 사용자 정보 저장
        session['username'] = username

        return redirect('/dashboard')
    else:
        return render_template('login.html')

다른 시스템에서 인증 확인

@app.route('/dashboard')
def dashboard():
    if 'username' in session:
        # 인증이 확인되었으므로 대시보드 페이지 렌더링
        username = session['username']
        return render_template('dashboard.html', username=username)
    else:
        # 인증이 실패한 경우 로그인 페이지로 이동
        return redirect('/login')

JWT (JSON Web Token) 기반 SSO

JWT (JSON Web Token)는 웹 애플리케이션 간 인증 정보를 안전하게 전송하기 위한 표준 방식입니다. Flask에서는 파이썬 JWT 라이브러리를 사용하여 JWT 기반 SSO를 구현할 수 있습니다.

파이썬 JWT 설치

pip install pyjwt

JWT 생성 및 유효성 검사

import jwt

# JWT 생성
def generate_token(username):
    payload = {'username': username}
    token = jwt.encode(payload, 'your_secret_key', algorithm='HS256')
    return token

# JWT 유효성 검사
def verify_token(token):
    try:
        payload = jwt.decode(token, 'your_secret_key', algorithms=['HS256'])
        return payload['username']
    except jwt.ExpiredSignatureError:
        # 토큰 만료
        return None
    except jwt.InvalidTokenError:
        # 잘못된 토큰
        return None

로그인 기능 구현

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')

        # 사용자 인증 로직

        if authentication_success:
            # 인증이 성공하면 JWT 생성
            token = generate_token(username)
            response = make_response(redirect('/dashboard'))
            # JWT를 쿠키에 저장
            response.set_cookie('jwt_token', token)

            return response
        else:
            # 인증 실패시 로그인 페이지로 이동
            return render_template('login.html')
    else:
        return render_template('login.html')

다른 시스템에서 인증 확인

@app.route('/dashboard')
def dashboard():
    # JWT 토큰 유효성 검사
    token = request.cookies.get('jwt_token')
    username = verify_token(token)

    if username:
        # 인증이 확인되었으므로 대시보드 페이지 렌더링
        return render_template('dashboard.html', username=username)
    else:
        # 인증이 실패한 경우 로그인 페이지로 이동
        return redirect('/login')

위에서는 Flask를 사용하여 세션 기반 SSO와 JWT 기반 SSO를 구현하는 방법에 대해 알아보았습니다. Flask는 다양한 확장 기능과 사용자 편의성을 제공하므로 SSO 구현에 있어 유용한 도구입니다.