Part 4, Flask Authentication
Session 인증 방식에 대해
세션 인증은 사용자가 로그인하면 서버 측에서 사용자의 상태(인증 정보)를 기록하고, 로그아웃하면 그 상태를 제거하는 방식으로 작동합니다. 이를 통해 사용자가 애플리케이션 내에서 다양한 요청을 할 때 로그인 상태를 유지할 수 있습니다.
세션이 필요한 이유
웹은 기본적으로 상태가 없는(stateless) 프로토콜입니다. 즉, 각 요청은 독립적으로 처리되므로, 서버는 HTTP 요청 간 사용자의 상태를 기억하지 못합니다. 세션은 이를 해결하기 위해 사용자의 상태 정보를 서버에 저장하고, 로그인된 상태를 유지할 수 있도록 도와줍니다.
세션 인증의 사용 사례
- 웹사이트 로그인: 사용자가 로그인 후 사이트 탐색 중에 로그인 상태를 유지하도록 돕습니다.
- 개인화된 사용자 경험: 사용자의 선호와 설정을 기억하여 맞춤형 서비스를 제공할 때 유용합니다.
- 장바구니: 온라인 쇼핑몰에서 장바구니에 담긴 상품을 세션을 통해 기억하고, 페이지 간에 상태를 유지할 수 있습니다.
세션 인증의 단점
- 보안: 세션 ID가 쿠키에 저장되므로 이를 해킹하지 않도록 주의해야 하며, 중요한 정보를 세션에 저장해서는 안 됩니다. 또한, **SECRET_KEY**가 유출될 수 있어 이를 안전하게 관리해야 합니다.
- 서버 리소스 사용: 세션 데이터는 서버에서 관리되므로, 많은 사용자가 접속하면 서버의 리소스가 많이 소모될 수 있습니다.
세션 인증의 동작 방식
- 로그인: 사용자가 자격 증명을 제출하면 서버는 이를 검증하고 세션에 인증 정보를 저장합니다.
- 세션 ID 발급: 서버는 세션 ID를 생성하고 이를 쿠키에 담아 클라이언트에 전달합니다.
- 상태 유지: 이후 사용자가 요청할 때마다 세션 ID가 서버로 전송되어 인증 상태를 유지합니다.
- 로그아웃: 사용자가 로그아웃하면 세션을 종료하고 세션 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 |