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:
- Gán giá trị:
session["nguoi_dung"] = "admin" - Mã hóa dữ liệu bằng secret_key
- 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)