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