面试题答案
一键面试1. 处理CORS策略
在Flask项目中,可使用flask - cors
库来处理CORS。
- 安装:通过
pip install flask - cors
安装该库。 - 配置:在Flask应用中配置允许的跨域来源。例如:
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
CORS(app, origins=['http://前端域名1', 'http://前端域名2']) # 允许特定前端域名跨域
若允许所有来源(不推荐在生产环境使用):
CORS(app)
2. 防止跨域攻击对认证授权流程的影响
- 使用HTTP Only Cookies:认证相关的Cookie设置
httponly=True
,这样JavaScript无法访问该Cookie,防止XSS攻击窃取Cookie中的认证信息。例如在Flask中设置Cookie:
from flask import make_response
@app.route('/login', methods=['POST'])
def login():
# 认证逻辑
resp = make_response('登录成功')
resp.set_cookie('auth_token', '生成的认证令牌', httponly=True)
return resp
- CSRF保护:虽然前后端分离项目CSRF风险相对较低,但仍可采取措施。对于非GET请求,可在前端生成并在请求头中携带CSRF Token,后端验证该Token。在Flask中可借助
Flask - WTF
库来实现CSRF保护,例如:
from flask_wtf.csrf import CSRFProtect
app = Flask(__name__)
csrf = CSRFProtect(app)
前端在发起请求时需在请求头中携带CSRF Token。
3. 认证头验证:使用基于Token的认证(如JWT),将认证信息放在请求头中(如Authorization: Bearer <token>
)。后端在处理请求时,先验证请求头中的认证信息,再处理业务逻辑。这样即使发生跨域请求,没有正确的认证头也无法通过认证。
3. 在分布式环境下保证认证授权的一致性
- 集中式认证服务:搭建一个独立的认证授权服务,所有后端服务都向该认证服务验证用户身份和权限。例如使用OAuth 2.0或OpenID Connect协议。这样可以确保所有服务使用统一的认证授权逻辑。
- 共享缓存:使用分布式缓存(如Redis)存储认证相关信息(如JWT的有效期、用户权限等)。各个服务在处理请求时,从共享缓存中获取认证信息,保证一致性。例如,当用户登录成功后,将认证信息存储在Redis中,其他服务验证请求时从Redis读取。
- Token的使用:使用自包含的Token(如JWT),Token中包含用户身份和权限信息。这样各个服务无需再查询数据库或其他存储来验证用户权限,只要验证Token的签名和有效期即可,保证了认证授权的一致性。同时,可设置合理的Token有效期,到期后用户需重新认证。