Quản Lý Phiên Làm Việc Trong Flask Với Flask-Session

Khái Niệm Cơ Bản Về Cookie và Session

Cookie là cơ chế lưu trữ thông tin tại phía trình duyệt, có kích thước giới hạn và tiềm ẩn rủi ro bảo mật. Khi giao thức HTTP không giữ trạng thái, cookie đóng vai trò như "thẻ thông hành" giúp máy chủ xác định danh tính người dùng qua mỗi yêu cầu.

Session khắc phục hạn chế của cookie bằng cách lưu trữ dữ liệu tại phía máy chủ dưới dạng cặp key-value. Trình duyệt chỉ giữ ID phiên làm việc, trong khi thông tin nhạy cảm được bảo quản an toàn trên hệ thống backend. Quá trình xác thực diễn ra khi máy chủ tra cứu trạng thái người dùng dựa trên ID này.

Cơ Chế Session Mặc Định Trong Flask

Flask sử dụng mô hình lưu trữ session tại client với quy trình:

  1. Gán giá trị: session["nguoi_dung"] = "admin"
  2. Mã hóa dữ liệu bằng secret_key
  3. Truyền qua cookie đến trình duyệt

Khi nhận yêu cầu, Flask giải mã cookie bằng secret_key để khôi phục session. Ưu điểm chính là không tốn tài nguyên server, nhưng nhược điểm bảo mật cần được xử lý thông qua các giải pháp mở rộng.

Cấu Hình Session Cơ Bản

Để kích hoạt session trong Flask, cần thiết lập secret_key:

# Cách 1: Dùng thuộc tính ứng dụng
app.secret_key = "K3Y_M4T_MA"

# Cách 2: Qua cấu hình
app.config['SECRET_KEY'] = "K3Y_M4T_MA"

Một số tham số quan trọng:

  • SESSION_COOKIE_NAME: Đặt tên cookie (mặc định: "session")
  • SESSION_COOKIE_HTTPONLY: Giới hạn truy cập qua JavaScript (nên đặt True)
  • PERMANENT_SESSION_LIFETIME: Thời hạn session tính bằng giây

Xóa session bằng session.pop('ten') hoặc session.clear().

Triển Khai Session Với Flask-Session

Mở rộng Flask-Session giải quyết vấn đề bảo mật bằng cách lưu trữ session trên các hệ thống bên ngoài. Các bước cài đặt:

pip install flask-session

Ví dụ cấu hình với Redis:

from flask import Flask
from flask_session import Session
import redis

app = Flask(__name__)
app.config['SECRET_KEY'] = 'KEY_BAO_MAT'
app.config['SESSION_TYPE'] = 'redis'
app.config['SESSION_REDIS'] = redis.Redis(
    host='localhost', 
    port=6379,
    db=0,
    password='matkhau_redis'
)
app.config['SESSION_USE_SIGNER'] = True  # Kích hoạt chữ ký số
Session(app)

Để tích hợp với blueprint, khởi tạo Session sau khi cấu hình ứng dụng:

def tao_ung_dung():
    app = Flask(__name__)
    # ... cấu hình cơ bản
    Session(app)  # Khởi tạo trước khi đăng ký blueprint
    app.register_blueprint(user_bp)
    return app

Bài Tập Thực Hành

Yêu cầu xây dựng hệ thống quản lý sinh viên với:

  • Trang đăng nhập bảo vệ bằng session
  • Trang tổng quan hiển thị danh sách rút gọn
  • Trang chi tiết chỉ truy cập khi đã xác thực

Triển khai decorator kiểm tra đăng nhập:

def kiem_tra_dang_nhap(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        if 'nguoi_dung' not in session:
            return redirect(url_for('dang_nhap'))
        return func(*args, **kwargs)
    return wrapper

Ví dụ xử lý đăng nhập:

@app.route('/dang_nhap', methods=['GET', 'POST'])
def dang_nhap():
    if request.method == 'POST':
        if request.form['ten'] == 'admin' and request.form['mat_khau'] == '123':
            session['nguoi_dung'] = 'admin'
            return redirect(url_for('tong_quan'))
        return 'Sai thông tin đăng nhập'
    return render_template('dang_nhap.html')

Trang tổng quan sử dụng decorator kiểm tra:

@app.route('/tong_quan')
@kiem_tra_dang_nhap
def tong_quan():
    return render_template('tong_quan.html', danh_sach=sinh_vien)

Thẻ: Flask Session Management Redis Web Security Flask-Session

Đăng vào ngày 21 tháng 6 lúc 08:29