Python/Python Flask

Flask에서 사용자 인증: 세션 관리 및 쿠키 사용

임베디드 친구 2025. 9. 11. 20:04
728x90
반응형

Flask에서 사용자 인증: 세션 관리 및 쿠키 사용

Flask는 가볍고 강력한 Python 웹 프레임워크로, 사용자 인증과 같은 웹 애플리케이션의 중요한 기능을 간단히 구현할 수 있는 도구들을 제공합니다. 이번 포스팅에서는 Flask에서 세션 관리 및 쿠키를 사용하여 사용자 인증을 구현하는 방법을 예제와 함께 자세히 살펴보겠습니다.

1. 세션(Session)과 쿠키(Cookie)의 개념

세션(Session)

  • 서버에 저장되는 사용자 데이터입니다.
  • 세션은 각 사용자에게 고유한 세션 ID를 부여하며, 이 세션 ID는 클라이언트(브라우저) 측 쿠키에 저장됩니다.
  • 세션은 주로 로그인 상태와 같은 사용자 정보를 저장하고 관리하는 데 사용됩니다.

쿠키(Cookie)

  • 클라이언트 측(브라우저)에 저장되는 데이터입니다.
  • 쿠키는 사용자 인증, 설정 저장, 추적 등을 위해 사용됩니다.
  • Flask는 쿠키를 활용하여 세션 ID를 클라이언트에 전달합니다.

2. Flask 세션 관리 기본 설정

Flask는 flask.session 모듈을 사용하여 세션 관리를 제공합니다. 이를 위해 Flask 애플리케이션에 몇 가지 설정을 추가해야 합니다.

기본 설정

from flask import Flask, session
import os

app = Flask(__name__)

# 비밀 키 설정
app.secret_key = os.urandom(24)

@app.route('/')
def home():
    return 'Welcome to Flask!'

if __name__ == '__main__':
    app.run(debug=True)
  • secret_key: 세션 데이터를 안전하게 보호하기 위한 키입니다.

3. 세션을 사용한 사용자 인증

로그인 구현

세션을 사용하여 사용자가 로그인할 때 사용자 정보를 저장할 수 있습니다.

예제: 로그인 및 로그아웃

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

app = Flask(__name__)
app.secret_key = 'your_secret_key'

# 사용자 데이터 (예: 데이터베이스 대신 딕셔너리 사용)
users = {
    'admin': 'password123',
    'user1': 'mypassword'
}

@app.route('/')
def home():
    if 'username' in session:
        return f"안녕하세요, {session['username']}! <a href='/logout'>로그아웃</a>"
    return "<a href='/login'>로그인</a>"

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        if username in users and users[username] == password:
            session['username'] = username
            return redirect(url_for('home'))
        return '로그인 실패. 다시 시도하세요.'
    return '''
        <form method="post">
            사용자 이름: <input type="text" name="username"><br>
            비밀번호: <input type="password" name="password"><br>
            <input type="submit" value="로그인">
        </form>
    '''

@app.route('/logout')
def logout():
    session.pop('username', None)
    return redirect(url_for('home'))

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

코드 설명

  1. session['username']: 사용자가 로그인하면 세션에 사용자 이름을 저장합니다.
  2. session.pop('username', None): 로그아웃 시 세션에서 사용자 이름을 제거합니다.
  3. users 딕셔너리: 간단한 사용자 인증을 위해 하드코딩된 사용자 데이터베이스 역할을 합니다.

4. 쿠키를 사용한 사용자 인증

세션 대신 쿠키를 직접 사용할 수도 있습니다.

예제: 쿠키를 이용한 사용자 인증

from flask import Flask, request, make_response

app = Flask(__name__)

@app.route('/')
def home():
    username = request.cookies.get('username')
    if username:
        return f"안녕하세요, {username}! <a href='/logout'>로그아웃</a>"
    return "<a href='/login'>로그인</a>"

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        response = make_response(redirect('/'))
        response.set_cookie('username', username, max_age=60*60*24)  # 쿠키 만료 시간: 1일
        return response
    return '''
        <form method="post">
            사용자 이름: <input type="text" name="username"><br>
            <input type="submit" value="로그인">
        </form>
    '''

@app.route('/logout')
def logout():
    response = make_response(redirect('/'))
    response.delete_cookie('username')
    return response

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

코드 설명

  1. request.cookies.get('username'): 쿠키에서 사용자 이름을 가져옵니다.
  2. response.set_cookie: 로그인 시 쿠키에 사용자 이름을 저장합니다.
  3. response.delete_cookie: 로그아웃 시 쿠키를 삭제합니다.

5. Flask-Security와 같은 확장 도구 사용

Flask-Security와 같은 확장을 사용하면 세션 관리와 사용자 인증을 더욱 간편하게 구현할 수 있습니다. 하지만 간단한 애플리케이션에서는 Flask 기본 기능만으로도 충분히 강력한 인증 시스템을 구축할 수 있습니다.

6. 보안 고려 사항

  • HTTPS 사용: 세션과 쿠키를 사용할 때 HTTPS를 통해 데이터를 암호화하여 전송해야 합니다.
  • 비밀 키 관리: secret_key는 외부에 노출되지 않도록 주의해야 합니다.
  • 쿠키 보안: 쿠키에 민감한 정보를 저장하지 않으며, HttpOnlySecure 속성을 설정합니다.
response.set_cookie('username', username, httponly=True, secure=True)

결론

이번 포스팅에서는 Flask에서 세션과 쿠키를 사용하여 사용자 인증을 구현하는 방법을 살펴보았습니다. Flask는 간단한 설정과 코드만으로도 강력한 인증 시스템을 제공할 수 있는 유연성을 가지고 있습니다. 실제 프로젝트에서 사용할 때는 보안 강화를 위한 추가적인 조치를 반드시 고려해야 합니다.

반응형