본문 바로가기
BIG DATA/PYTHON

[PYTHON] Flask로 로그인 기능 구현하기 (세션 활용)

by 라일리T 2025. 2. 27.

Flask로 로그인 기능 구현하기 (세션 활용)

이전 글에서는 Flask를 활용한 웹 애플리케이션 개발 및 데이터베이스 연동을 배웠습니다.
이번 글에서는 사용자 로그인 기능을 구현해 보겠습니다.

로그인 기능을 만들기 위해 다음 개념을 활용합니다.
Flask-WTF → 로그인 폼 생성
Flask-Session → 로그인 유지
SQLite → 사용자 정보 저장

 

 

[PYTHON] Flask를 이용한 간단한 웹 애플리케이션 만들기

Flask를 이용한 간단한 웹 애플리케이션 만들기 이전 글에서는 자동 이메일 발송 기능을 구현해 보았습니다.이제 Python을 활용하여 간단한 웹 애플리케이션을 만들어 보겠습니다.웹 애플리케이

englishforkid.tistory.com

 


1. 필요한 라이브러리 설치

📌 Flask-WTF와 Flask-Session을 설치합니다.

pip install flask flask-wtf flask-session

📌 SQLite는 기본적으로 Python에 포함되어 있어 따로 설치할 필요가 없습니다.


2. 사용자 테이블 생성 (SQLite)

먼저, 사용자의 아이디와 비밀번호를 저장할 데이터베이스를 생성합니다.

import sqlite3

conn = sqlite3.connect("users.db")
cursor = conn.cursor()

# 사용자 테이블 생성
cursor.execute("""
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        username TEXT UNIQUE NOT NULL,
        password TEXT NOT NULL
    )
""")

conn.commit()
conn.close()

✅ username TEXT UNIQUE NOT NULL → 중복된 아이디 방지
✅ password TEXT NOT NULL → 비밀번호 저장


3. Flask 로그인 시스템 구현

3.1 Flask 설정 (app.py)

from flask import Flask, render_template, request, redirect, url_for, session
import sqlite3
from werkzeug.security import generate_password_hash, check_password_hash

app = Flask(__name__)
app.secret_key = "supersecretkey"  # 세션을 위한 비밀 키
app.config["SESSION_TYPE"] = "filesystem"

# 데이터베이스 연결 함수
def get_db_connection():
    conn = sqlite3.connect("users.db")
    conn.row_factory = sqlite3.Row
    return conn

# 홈 페이지
@app.route("/")
def home():
    if "user" in session:
        return f"안녕하세요, {session['user']}님! <a href='/logout'>로그아웃</a>"
    return "<a href='/login'>로그인</a> 또는 <a href='/register'>회원가입</a>하세요."

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

✅ session["user"] → 로그인된 사용자 정보 저장
✅ secret_key → 세션 데이터를 보호하는 키


3.2 회원가입 기능

사용자가 아이디와 비밀번호를 입력하여 회원가입할 수 있도록 합니다.

📌 HTML 회원가입 폼 (templates/register.html)

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>회원가입</title>
</head>
<body>
    <h1>회원가입</h1>
    <form method="POST">
        아이디: <input type="text" name="username" required><br>
        비밀번호: <input type="password" name="password" required><br>
        <button type="submit">가입하기</button>
    </form>
</body>
</html>

📌 Flask 회원가입 처리 (app.py)

@app.route("/register", methods=["GET", "POST"])
def register():
    if request.method == "POST":
        username = request.form["username"]
        password = generate_password_hash(request.form["password"])  # 비밀번호 암호화

        conn = get_db_connection()
        cursor = conn.cursor()
        try:
            cursor.execute("INSERT INTO users (username, password) VALUES (?, ?)", (username, password))
            conn.commit()
            return "회원가입 성공! <a href='/login'>로그인</a>"
        except sqlite3.IntegrityError:
            return "⚠️ 이미 존재하는 아이디입니다. <a href='/register'>다시 시도</a>"
        finally:
            conn.close()
    
    return render_template("register.html")

✅ generate_password_hash(password) → 비밀번호 암호화
✅ sqlite3.IntegrityError → 중복 아이디 방지


3.3 로그인 기능

📌 HTML 로그인 폼 (templates/login.html)

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>로그인</title>
</head>
<body>
    <h1>로그인</h1>
    <form method="POST">
        아이디: <input type="text" name="username" required><br>
        비밀번호: <input type="password" name="password" required><br>
        <button type="submit">로그인</button>
    </form>
</body>
</html>

📌 Flask 로그인 처리 (app.py)

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

        conn = get_db_connection()
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM users WHERE username = ?", (username,))
        user = cursor.fetchone()
        conn.close()

        if user and check_password_hash(user["password"], password):  # 비밀번호 검증
            session["user"] = username
            return redirect(url_for("home"))
        else:
            return "⚠️ 아이디 또는 비밀번호가 올바르지 않습니다. <a href='/login'>다시 시도</a>"
    
    return render_template("login.html")

✅ check_password_hash(user["password"], password) → 입력한 비밀번호 확인
✅ session["user"] = username → 로그인된 사용자 세션 유지


3.4 로그아웃 기능

로그인 상태를 유지하는 세션을 삭제하여 로그아웃할 수 있도록 합니다.

📌 Flask 로그아웃 처리 (app.py)

@app.route("/logout")
def logout():
    session.pop("user", None)  # 세션 삭제
    return redirect(url_for("home"))

✅ session.pop("user", None) → 로그인 정보 삭제


4. 최종 실행 방법

1️⃣ 데이터베이스 테이블 생성

python create_db.py

2️⃣ Flask 웹 애플리케이션 실행

python app.py

3️⃣ 브라우저에서 테스트

  • http://127.0.0.1:5000/register → 회원가입
  • http://127.0.0.1:5000/login → 로그인
  • http://127.0.0.1:5000/logout → 로그아웃

5. 결론

이번 글에서는 Flask로 로그인 시스템을 구축하는 방법을 배웠습니다.

  • SQLite로 사용자 정보 저장
  • Flask에서 회원가입 및 로그인 구현
  • 비밀번호 암호화 및 세션 활용

다음 글에서는 Flask와 Bootstrap을 활용하여 UI를 개선하는 방법을 배워보겠습니다! 🚀

 

 

 

[PYTHON] 파이썬 웹 크롤링 데이터를 활용한 데이터 분석

웹 크롤링 데이터를 활용한 데이터 분석 이전 글에서는 **웹 크롤링(Web Scraping)**을 이용해 웹에서 데이터를 수집하는 방법을 배웠습니다.그렇다면 크롤링한 데이터를 어떻게 활용할 수 있을까

englishforkid.tistory.com

 

 

[PYTHON] Python으로 자동 이메일 발송하기 (SMTP 활용)

Python으로 자동 이메일 발송하기 (SMTP 활용) 이전 글에서는 크롤링한 데이터를 자동으로 보고서로 저장하는 방법을 배웠습니다.이제 이 보고서를 이메일로 자동 전송할 수 있다면 더욱 편리하겠

englishforkid.tistory.com