Session和JWT (JSON Web Token) 是两种不同的身份验证和授权机制。

Session

一种基于服务器的身份验证和授权机制。在使用Session时,服务器会为每个用户创建一个唯一的Session ID,并将该ID存储在服务器端的存储介质中(如内存、数据库等)。当用户进行身份验证后,服务器会将Session ID发送给用户,用户在后续的请求中需要携带该Session ID,供服务器进行身份验证和授权。

JWT

一种基于令牌(Token)的身份验证和授权机制。在使用JWT时,服务器会颁发一个令牌(Token)给用户,该令牌包含了用户的身份信息和其他相关的元数据。用户在后续的请求中需要携带该令牌,供服务器进行身份验证和授权。JWT是基于JSON格式的,通常由三部分组成:头部(Header)、负载(Payload)和签名(Signature)。头部包含了令牌的类型和加密算法信息,负载包含了用户的身份信息,签名用于验证令牌的真实性和完整性。

两者的主要区别在于数据存储方式和验证方式的不同。Session需要服务器端存储Session数据,并通过Session ID进行验证;而JWT是通过令牌进行验证,不需要在服务器端存储任何数据。这使得JWT在分布式系统和跨域场景下更具优势,因为令牌可以在不同的服务器之间传递和验证。

代码:

使用Session进行身份验证和授权的示例:

# 服务器端
from flask import Flask, request, session

app = Flask(__name__)
app.secret_key = 'secret-key'  # 设置Session加密密钥

@app.route('/login', methods=['POST'])
def login():
    # 根据用户名和密码进行身份验证
    username = request.form['username']
    password = request.form['password']
    if verify_credentials(username, password):
        session['username'] = username  # 将用户名保存在Session中
        return 'Login successful'
    else:
        return 'Invalid credentials'

@app.route('/protected', methods=['GET'])
def protected():
    if 'username' in session:
        return 'Protected resource'
    else:
        return 'Unauthorized'

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

# 客户端
import requests

# 登录
response = requests.post('http://localhost:5000/login', data={'username': 'admin', 'password': 'pass'})
print(response.text)

# 访问受保护资源
response = requests.get('http://localhost:5000/protected')
print(response.text)

使用JWT进行身份验证和授权的示例:

# 服务器端
from flask import Flask, request
import jwt

app = Flask(__name__)
app.secret_key = 'secret-key'  # 设置JWT加密密钥

@app.route('/login', methods=['POST'])
def login():
    # 根据用户名和密码进行身份验证
    username = request.form['username']
    password = request.form['password']
    if verify_credentials(username, password):
        token = jwt.encode({'username': username}, app.secret_key, algorithm='HS256')
        return token
    else:
        return 'Invalid credentials'

@app.route('/protected', methods=['GET'])
def protected():
    token = request.headers.get('Authorization').split()[1]  # 从请求头中获取令牌
    try:
        decoded_token = jwt.decode(token, app.secret_key, algorithms='HS256')
        return 'Protected resource'
    except jwt.exceptions.DecodeError:
        return 'Invalid token'

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

# 客户端
import requests

# 登录
response = requests.post('http://localhost:5000/login', data={'username': 'admin', 'password': 'pass'})
token = response.text

# 访问受保护资源
headers = {'Authorization': f'Bearer {token}'}
response = requests.get('http://localhost:5000/protected', headers=headers)
print(response.text)