Chapter 4-7 Flask Authentication/ Session 인증 방식

2025. 4. 22. 18:48·Flask

Part 4, Flask Authentication

Session 인증 방식에 대해

세션 인증은 사용자가 로그인하면 서버 측에서 사용자의 상태(인증 정보)를 기록하고, 로그아웃하면 그 상태를 제거하는 방식으로 작동합니다. 이를 통해 사용자가 애플리케이션 내에서 다양한 요청을 할 때 로그인 상태를 유지할 수 있습니다.

세션이 필요한 이유

웹은 기본적으로 상태가 없는(stateless) 프로토콜입니다. 즉, 각 요청은 독립적으로 처리되므로, 서버는 HTTP 요청 간 사용자의 상태를 기억하지 못합니다. 세션은 이를 해결하기 위해 사용자의 상태 정보를 서버에 저장하고, 로그인된 상태를 유지할 수 있도록 도와줍니다.

세션 인증의 사용 사례

  • 웹사이트 로그인: 사용자가 로그인 후 사이트 탐색 중에 로그인 상태를 유지하도록 돕습니다.
  • 개인화된 사용자 경험: 사용자의 선호와 설정을 기억하여 맞춤형 서비스를 제공할 때 유용합니다.
  • 장바구니: 온라인 쇼핑몰에서 장바구니에 담긴 상품을 세션을 통해 기억하고, 페이지 간에 상태를 유지할 수 있습니다.

세션 인증의 단점

  • 보안: 세션 ID가 쿠키에 저장되므로 이를 해킹하지 않도록 주의해야 하며, 중요한 정보를 세션에 저장해서는 안 됩니다. 또한, **SECRET_KEY**가 유출될 수 있어 이를 안전하게 관리해야 합니다.
  • 서버 리소스 사용: 세션 데이터는 서버에서 관리되므로, 많은 사용자가 접속하면 서버의 리소스가 많이 소모될 수 있습니다.

세션 인증의 동작 방식

  1. 로그인: 사용자가 자격 증명을 제출하면 서버는 이를 검증하고 세션에 인증 정보를 저장합니다.
  2. 세션 ID 발급: 서버는 세션 ID를 생성하고 이를 쿠키에 담아 클라이언트에 전달합니다.
  3. 상태 유지: 이후 사용자가 요청할 때마다 세션 ID가 서버로 전송되어 인증 상태를 유지합니다.
  4. 로그아웃: 사용자가 로그아웃하면 세션을 종료하고 세션 ID를 무효화합니다.

Flask에서 기본적으로 제공하는 Session 인증 방법

app.py 예시 코드

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

app = Flask(__name__)
app.secret_key = 'your_secret_key'  # 실제 배포 시에는 환경변수나 .env 파일에서 관리

# 예시 사용자 데이터
users = {
    "john": "pw123",
    "leo": "pw123"
}

@app.route('/')
def index():
    return render_template('login.html')

@app.route('/login', methods=['POST'])
def login():
    username = request.form['username']
    password = request.form['password']
    if username in users and users[username] == password:
        session['username'] = username  # 세션에 사용자명 저장
        return redirect('/secret')  # 비밀 페이지로 리디렉션
    else:
        flash('Invalid username or password')  # 로그인 실패 시 메시지
        return redirect('/')

@app.route('/secret')
def secret():
    if 'username' in session:
        return render_template('secret.html')  # 로그인된 사용자의 비밀 페이지
    else:
        return redirect('/')  # 로그인되지 않으면 다시 로그인 페이지로 리디렉션

@app.route('/logout')
def logout():
    session.pop('username', None)  # 세션에서 사용자명 삭제
    return redirect('/')  # 로그인 페이지로 리디렉션

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

templates/login.html 예시 코드

<!DOCTYPE html>
<html>
<head>
    <title>Login</title>
</head>
<body>
    <h2>Login</h2>
    <form method="POST" action="/login">
        <input type="text" name="username" placeholder="Username" required>
        <input type="password" name="password" placeholder="Password" required>
        <button type="submit">Login</button>
    </form>
</body>
</html>

templates/secret.html 예시 코드

<!DOCTYPE html>
<html>
<head>
    <title>Secret Page</title>
</head>
<body>
    <h2>Welcome to the Secret Page!</h2>
    <a href="/logout">Logout</a>
</body>
</html>

세션 관련 주요 함수

1. session 객체 사용법

  • 세션에 데이터 저장:
session['username'] = 'john'  # 세션에 사용자명 저장
  • 세션에서 데이터 가져오기:
username = session['username']  # 세션에서 사용자명 가져오기
  • get() 메소드 사용:
username = session.get('username')  # 존재하지 않으면 None 반환
  • 세션에서 데이터 제거:
session.pop('username', None)  # 세션에서 'username' 삭제
  • 세션 클리어:
session.clear()  # 세션의 모든 데이터 삭제

2. 세션 유지 기간 설정

세션의 유지 기간을 설정할 수 있습니다. permanent 속성을 True로 설정하면, PERMANENT_SESSION_LIFETIME에 설정된 기간 동안 세션이 유지됩니다.

from datetime import timedelta

app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7)  # 7일 동안 세션 유지

세션이 영구적으로 유지되도록 설정하려면, 로그인할 때 session.permanent = True를 추가합니다.

@app.route('/login', methods=['POST'])
def login():
    session['username'] = 'your_username'
    session.permanent = True  # 세션 유지 기간 활성화
    return redirect(url_for('secret'))

Flask 기본 세션 모듈에서 제공하는 함수들

Flask에서는 session 객체를 통해 세션 데이터를 손쉽게 관리할 수 있습니다. 이를 통해 인증 및 사용자 세션 관리 기능을 구현할 수 있으며, 로그인 상태를 유지하거나 로그아웃을 구현하는데 유용합니다.

세션 관리의 장점:

  • 사용자가 웹 사이트에서 로그인하면 세션을 통해 상태를 유지할 수 있습니다.
  • 사용자 맞춤화된 정보(예: 장바구니, 추천 목록 등)를 저장할 수 있습니다.
  • 데이터베이스와 서버 메모리에서 사용자 상태를 관리하여 웹 애플리케이션이 효율적으로 동작하게 합니다.

결론

Flask에서 세션 인증은 매우 중요한 기능으로, 사용자 인증 상태를 서버 측에서 관리할 수 있게 해줍니다. 이를 통해 로그인이 유지되며, 로그아웃 시 세션 데이터를 삭제하고 사용자 상태를 관리할 수 있습니다. 위 코드를 활용해 기본적인 세션 인증 시스템을 구현할 수 있습니다. 세션 유지 기간 설정과 세션 데이터 삭제는 보안적인 측면에서 중요한 요소로, 실무에서는 이와 같은 기법을 사용하여 웹 애플리케이션을 구현할 수 있습니다.

'Flask' 카테고리의 다른 글

Chapter 4-7(1) 로그인, 세션 관리 및 보안 페이지 Authentication/ Session  (0) 2025.04.22
Chapter 4-8 HTTP 기본 인증 Basic Authentication, Flask-HTTPAuth  (0) 2025.04.22
Chapter 4-6 실습_블로그 구현 (Flask-MySQL를 활용) posts_routes.py  (0) 2025.04.22
Chapter 4-4 실습_블로그 구현 (Flask-MySQL를 활용) MySQL 쿼리, db.yaml  (0) 2025.04.22
Chapter 4-3 실습_블로그 구현 (Flask-MySQL를 활용) templates/posts.html  (0) 2025.04.22
'Flask' 카테고리의 다른 글
  • Chapter 4-7(1) 로그인, 세션 관리 및 보안 페이지 Authentication/ Session
  • Chapter 4-8 HTTP 기본 인증 Basic Authentication, Flask-HTTPAuth
  • Chapter 4-6 실습_블로그 구현 (Flask-MySQL를 활용) posts_routes.py
  • Chapter 4-4 실습_블로그 구현 (Flask-MySQL를 활용) MySQL 쿼리, db.yaml
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (657) N
      • Python (32)
      • 프로젝트 (43)
      • 과제 (25)
      • Database (40)
      • 멘토링 (11) N
      • 특강 (34) N
      • 기술블로그 (36) N
      • 기술블로그-Fastapi편 (20) N
      • 기술블로그-Django편 (152) N
      • 기술블로그-Flask편 (35)
      • AI 분석 (4)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (72)
      • Fastapi (1) N
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
Chapter 4-7 Flask Authentication/ Session 인증 방식
상단으로

티스토리툴바