同时发送两个请求返回401错误,是否与Cookie的JSESSIONID参数有关?
并发同会话PUT请求返回401的常见原因及排查方案
请求详情
Request URL: http://localhost:5000/api/*** Request Method: PUT Status Code: 401 Date: Mon, 01 Nov 2021 23:20:08 GMT Cookie: JSESSIONID=D0A23516553FAA68121D9013A986D62C Request URL: http://localhost:5000/api/*** Request Method: PUT Status Code: 401 Date: Mon, 01 Nov 2021 23:20:08 GMT Cookie: JSESSIONID=D0A23516553FAA68121D9013A986D62C
可能的原因
- 单会话并发请求限制:部分服务端为防范会话劫持、重放攻击或接口竞态问题,会限制同一JSESSIONID同一时间仅允许处理1个请求,超出的并发同会话请求会直接被鉴权模块拦截返回401,两个请求时间戳完全一致、共用同一会话ID,完全符合该限制的触发条件。
- 单次生效的CSRF Token校验失败:如果服务端开启了CSRF防护,且配置了CSRF Token单次有效规则(每次请求校验通过后立即刷新Token,旧Token作废),两个并发请求携带相同的CSRF Token时,第一个请求校验通过后旧Token失效,第二个请求用旧Token校验就会直接返回401。提供的请求头中未携带CSRF相关参数,可优先检查是否遗漏了该参数配置。
- 会话状态竞态修改:如果两个请求的处理逻辑包含修改当前会话状态的操作(比如刷新会话有效期、更新会话权限、销毁旧会话生成新会话),第一个请求完成会话状态修改后,第二个请求携带的旧会话ID在服务端已经失效,鉴权不通过返回401。
- 网关层并发拦截规则:如果服务前部署了网关或反向代理,可能配置了同身份短时间高频请求拦截规则,同一时间的两个相同请求被判定为异常流量,直接返回401。
排查建议
- 优先查看服务端鉴权模块的日志,定位401具体触发在会话校验、CSRF校验还是权限校验阶段
- 把两个并行请求改成串行发送,验证是否还会返回401,如果串行请求正常,基本可以确定是并发场景触发的服务端限制
- 检查服务端是否配置了单会话并发数限制、CSRF Token单次生效、请求处理逻辑修改会话状态的相关代码
内容的提问来源于stack exchange,提问作者itpr
相关产品推荐
相关产品推荐

