Flask-Login 을 활용한 간단한 로그인 프로젝트

2025. 4. 23. 18:26·기술블로그-Flask편

📌 개념 정리

Flask-Login은 Flask 애플리케이션에 사용자 인증 및 세션 관리를 쉽게 구현할 수 있도록 도와주는 확장입니다. 이 확장을 사용하면 로그인, 로그아웃, 세션 유지 등을 간편하게 관리할 수 있습니다.

  • Flask-Login의 주요 기능
    • 사용자 로그인, 로그아웃 처리
    • 로그인한 사용자만 접근할 수 있는 보호된 페이지 제공
    • 세션을 사용하여 사용자 상태 유지

🚦 동작 원리 및 구조

  1. Flask 애플리케이션 생성 및 설정
    • app.py 파일에서 Flask 애플리케이션을 생성하고, flask_login.LoginManager()를 통해 로그인 관리자를 초기화합니다.
    • login_manager.login_view에 로그인 뷰를 설정하여, 로그인이 필요한 페이지에 접근할 때 자동으로 로그인 페이지로 리디렉션됩니다.
  2. 로그인 처리
    • 사용자가 로그인할 때, 입력한 사용자명과 비밀번호를 확인하고, 일치하면 login_user()를 호출하여 세션에 사용자 정보를 저장합니다.
    • 로그인 실패 시, flash()로 오류 메시지를 표시합니다.
  3. 세션 관리 및 보호된 페이지
    • 로그인한 사용자만 접근 가능한 페이지는 @login_required 데코레이터를 사용하여 보호됩니다.
    • load_user() 함수는 Flask-Login이 사용자를 로딩할 때 호출되며, 세션에 저장된 user_id로 사용자 객체를 반환합니다.

💻 코드 예시 및 흐름 분석

app.py

from flask import Flask
from flask_login import LoginManager
from models import User
from routes import configure_route  # routes.py에서 라우팅을 관리한다고 가정

app = Flask(__name__)
app.secret_key = 'flask-secret-key'  # 세션을 안전하게 관리하기 위한 secret_key 설정

# 로그인 매니저 설정
login_manager = LoginManager()
login_manager.init_app(app)  # 이미 `init_app(app)`으로 연결

# 로그인 뷰 설정
login_manager.login_view = 'login'

# 사용자 로딩 함수 설정 (사용자가 로그인할 때 호출)
@login_manager.user_loader
def load_user(user_id):
    return User.get(user_id)  # 사용자가 로그인할 때 세션에 저장된 `user_id`로 사용자 객체를 로드

# 라우팅 함수들을 routes.py에서 설정한다고 가정
configure_route(app)

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

흐름 분석:

  1. Flask 애플리케이션을 설정하고, 로그인 관리자 LoginManager를 초기화합니다.
  2. 로그인 뷰 login을 설정하여, 로그인이 필요한 페이지는 자동으로 로그인 페이지로 리디렉션됩니다.
  3. user_loader 함수는 세션에 저장된 user_id로 사용자를 로딩합니다.

routes.py

from flask import render_template, request, redirect, url_for, flash
from models import User, users
from flask_login import login_user, logout_user, login_required

def configure_route(app):
    # 홈 페이지
    @app.route('/')
    def index():
        return render_template('index.html')

    # 로그인 페이지
    @app.route('/login', methods=['GET', 'POST'])
    def login():
        if request.method == 'POST':
            username = request.form['username']
            password = request.form['password']
            
            # 사용자 찾기 (username을 사용하여 User 객체 반환)
            user = User.get(username)

            # 사용자와 비밀번호 검증
            if user and users[username]['password'] == password:
                login_user(user)  # Flask-Login으로 로그인 처리
                return redirect(url_for('index'))  # 로그인 후 메인 페이지로 리디렉션
            else:
                flash('Invalid username or password')  # 잘못된 로그인 정보 처리

        return render_template('login.html')  # GET 요청시 로그인 페이지 렌더링

    # 로그아웃 처리
    @app.route('/logout')
    def logout():
        logout_user()  # Flask-Login으로 로그아웃 처리
        return redirect(url_for('index'))  # 로그아웃 후 메인 페이지로 리디렉션

    # 보호된 페이지
    @app.route('/protected')
    @login_required  # 로그인된 사용자만 접근 가능
    def protected():
        return "<h1>Protected Page</h1> <a href='/logout'>Logout</a>"

흐름 분석:

  • /login에서 POST 요청이 들어오면, 사용자 이름과 비밀번호를 확인하고, 올바르면 로그인하고 메인 페이지로 리디렉션합니다.
  • 로그아웃은 /logout에서 처리하며, 로그아웃 후 메인 페이지로 리디렉션합니다.
  • /protected 페이지는 로그인한 사용자만 접근할 수 있습니다.

models.py

from flask_login import UserMixin

users = {'admin': {'password': 'pw123'}}

class User(UserMixin):
  def __init__(self, username):
    self.id = username
    
  @staticmethod
  def get(user_id):
    if user_id in users:
      return User(user_id)
    
    return None

흐름 분석:

  • User 클래스는 Flask-Login의 UserMixin을 상속하여 사용자가 로그인할 때 필요한 속성을 갖습니다.
  • get() 메서드는 사용자 이름을 사용하여 사용자 객체를 반환합니다.

login.html

<!DOCTYPE html>
<html>

  <head>
    <title>Login</title>
  </head>

  <body>
    <h1>Login</h1>
    <form method="post">
      Username: <input type="text" name="username" /><br />
      Password: <input type="password" name="password" /><br />
      <input type="submit" value="Login" />
    </form>
  </body>

</html>

흐름 분석:

  • 사용자가 로그인 페이지에서 사용자명과 비밀번호를 입력하고 제출하면, POST 요청으로 로그인 처리가 이루어집니다.

index.html

<!DOCTYPE html>
<html>

  <head>
    <title>Home Page</title>
  </head>

  <body>
    <h1>Welcome to the Home Page</h1>
    <a href="/login">Login</a> |
    <a href="/logout">Logout</a> |
    <a href="/protected">Protected Page</a>
  </body>

</html>

흐름 분석:

  • 메인 페이지에서 로그인, 로그아웃, 보호된 페이지로 이동할 수 있는 링크를 제공합니다.

🧪 실전 사례

이 예제는 Flask와 Flask-Login을 활용하여 로그인 시스템을 구현하는 간단한 예제입니다. 실제 프로젝트에서는 로그인 시스템을 추가하여 사용자 인증 및 권한 관리를 할 수 있습니다.

🧠 고급 팁 or 자주 하는 실수

  • 세션 보안: secret_key는 강력한 값으로 설정해야 하며, 프로덕션 환경에서는 os.environ을 통해 환경 변수로 관리하는 것이 좋습니다.
  • 폼 검증: 실제로는 로그인 폼에서 username과 password에 대한 추가적인 검증을 해야 합니다. 예를 들어, 비밀번호 암호화를 사용하는 것이 권장됩니다.

✅ 마무리 요약 및 복습 포인트

  • Flask-Login을 사용하여 로그인 시스템을 구축하는 방법을 배웠습니다.
  • login_required 데코레이터를 사용하여 보호된 페이지를 만들었습니다.
  • 로그인 시 사용자 정보를 세션에 저장하고, 로그아웃 시 세션을 삭제하는 방법을 구현했습니다.

'기술블로그-Flask편' 카테고리의 다른 글

🚀 Flask 프로젝트에서 routes.py와 services의 역할 이해하기(1-2)  (0) 2025.04.24
🚀 Git Flow 브랜치 전략 초기 셋팅 가이드(1-1)  (0) 2025.04.24
Flask 문의 내역 이메일 발송 시스템 구현 with 파머  (0) 2025.04.23
📌 SMTP,프로토콜,통신 규약 이란?  (0) 2025.04.23
Flask : 서비스 기획부터 API 개발까지: 시스템 설계의 전체 흐름(with 프론트엔드 소통)  (0) 2025.04.23
'기술블로그-Flask편' 카테고리의 다른 글
  • 🚀 Flask 프로젝트에서 routes.py와 services의 역할 이해하기(1-2)
  • 🚀 Git Flow 브랜치 전략 초기 셋팅 가이드(1-1)
  • Flask 문의 내역 이메일 발송 시스템 구현 with 파머
  • 📌 SMTP,프로토콜,통신 규약 이란?
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (787)
      • Python (32)
      • 프로젝트 (110)
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (41)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (153)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
      • 연예 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    homebartrend
    college reunions
    americanlaw
    hotcoffeecase
    youngprofessionals
    btsreunion
    life reflection
    basalcellcarcinoma
    btsjungkook
    self-growth
    btscomeback
    bts
    travel ban
    americaparty
    newpoliticalparty
    smartphonedurability
    remittance
    RM
    livebroadcast
    btsdischarge
    trumpmuskclash
    urbantrends
    classaction
    lawsuitculture
    global politics
    chinanightlife
    chatgpterror
    gpterror
    titaniumcase
    뷔
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
Flask-Login 을 활용한 간단한 로그인 프로젝트
상단으로

티스토리툴바