Python面试问题合集
- 1.Cookie、Session、Token是什么以及他们的区别
- 2. JWT是什么?如何实现的?
- 3.谈谈对 RESTful API 设计的理解
- 4.FastAPI 、Django、Flask框架之间的定义及区别
- 5.Python 并发编程核心原理
- 6.解释 Python 中的深拷贝(deepcopy)和浅拷贝(shallow copy)的区别,分别在什么场景下使用?
- 7.谈谈 Python 的垃圾回收机制(GC),主要采用哪些策略?
- 8.什么是微服务架构?它和单体架构的区别是什么?微服务之间如何实现通信?
- 9.如何用 Redis 实现分布式锁?需要注意哪些问题?(如死锁、锁超时)
- 10.Redis 的核心数据结构有哪些?(String、Hash、List、Set、Sorted Set)分别适合什么场景?如何用 Redis 实现缓存穿透、缓存击穿、缓存雪崩的解决方案?
1.Cookie、Session、Token是什么以及他们的区别
核心结论:Cookie是客户端存储工具,Session是服务器的状态存储机制,Token是加密的身份凭证(客户端存储),三者的核心区别在于存储位置和状态依赖,直接影响系统的可扩展性。Session和Token是API/Web 系统中两种核心的身份认证机制,
什么是Session (会话)?
核心定义:Session是服务器存储的用户登录状态,本质是键值对集合(如存储用户ID、登录时间以及角色)
工作流程
用户登录 → 服务器验证 → 用户创建Session(存储用户状态) → 返回Sesion ID(通常存在cookie中)
↓
用户后续请求 → 自动携带cookie中的Session ID → 服务器通过Session ID查询登录状态 → 服务器处理请求
↓
用户退出登录 → 服务器删除对应的Session → 用户身份失效
关键特点
存储位置:核心数据(用户状态)存储在服务器(内存、Redis、MySQL等),客户端只存储Session ID(通常存储在Cookie里)
状态依赖:服务器必须存储Session数据,属于“有状态认证”
优点:安全(核心数据不暴露给客户端)、实现简单
缺点:
- 可扩展性差:服务器集群部署时,需要同步Session数据,否则更换服务器后会重新登录。
- 依赖Cookie:客户端禁用Cookie时,Session会失效
- 可能占用服务器资源:用户量大时,Session存储会消耗服务器内存或数据库资源。
什么是 Token (令牌)?
核心定义:服务器生成的“加密字符串”,本质是“包含用户身份信息的凭证”,服务器不存储审核状态,所有需要的用户信息(如用户ID、角色、过期时间)都加密在Token中,客户端自己保存。
工作流程
用户登录 → 服务器验证 → 服务器用密钥加密用户信息(ID、过期时间) → 生成Token返回客户端
↓
用户后续请求 → 客户端在请求头携带Token → 服务器用密钥解密Token → 验证有效性(是否过期、签名是否正确) → 确认身份后处理请求
↓
用户退出登录 → 客户端直接删除本地存储的Token → 身份失效(服务器端无需操作)
关键特点
存储位置:核心数据加密后存在客户端(LocalStorage、SessionStorage、APP本地缓存等),服务器不存储任何状态;
状态依赖:服务器无状态(不存用户信息),属于无状态认证
优点:可扩展性强,不依赖Cookie,轻量高效;
缺点:
–安全性依赖:密码泄露导致Token伪造,需要要个保密;
–需要设置合理时间:过长导致安全风险,过短需要用户频繁登录;
–无法主动作废:Token生成后,过期前始终有效;
2. JWT是什么?如何实现的?
核心定义
JWT(JSON Web Token)是基于JSON的轻量级身份认证令牌,核心是将用户信息(如ID、角色)加密为字符串,供客户端存储和传递,服务器端通过解密验证身份,无需存储会话状态。
核心组成
本质是由3段base64编码的JSON字符串拼接,结构为Header、Payload、Signature。
Header:声明加密算法和令牌类型,格式{“alg”:“HS256”,“typ”:“JWT”},编码可逆;
Payload:存储用户的核心信息和标准声明,自定义字段用户ID、角色、权限等非敏感数据,编码可逆;
Signature:验证令牌未被篡改,是JWT的核心,编码不可逆依赖密钥Secret Key;
工作流程
1.用户登录:客户端提交用户名/密码到服务器(如 POST /api/login);
2.令牌生成:服务器通过验证后,按照上述结构生成JWT令牌,返回给客户端;
3.身份验证:客户端后续请求时,在请求头中携带令牌(格式:Authorization:Bearer<JWT>);
4.令牌验证:服务器接收后,按以下步骤进行验证:
- 拆分Header、Payload、Signature;
- 用密钥和Header中的加密算法,重新计算签名,与Signature对比;
- 校验Payload中的exp字段,判断令牌是否过期;
- 验证通过后,提取Payload中的用户信息,处理后续业务逻辑;
3.谈谈对 RESTful API 设计的理解
核心定义
遵循 REST 架构风格设计的接口规范,核心是 以资源为中心,利用HTTP方法(POST、PUT、GET、DELETE等)来操作资源,实现无状态、可缓存、可扩展的接口交互。
核心本质
- 资源是核心:接口操作的对象是资源(如用户、商品、订单等),每个资源都有唯一标识符URL,URL只描述资源是什么,不包含操作动作(如删除、查询);
- HTTP语言是工具:用HTTP自带的方法表示对资源的操作,不用额外定义接口用途,提高API的可理解性;
- 无状态是基础:服务器不存储客户端的会话状态,每次请求都包含完整的认证信息,便于系统横向扩展;
- 合理利用状态码:200 OK(查询 / 更新成功)、201 Created(创建成功)、204 No Content(删除成功)、400 Bad Request(参数错误)、401 Unauthorized(未登录)、403 Forbidden(无权限)、404 Not Found(资源不存在)、500 Internal Server Error(服务器异常)、503 Service Unavailable(服务暂不可用)

被折叠的 条评论
为什么被折叠?



