1、 什么是无状态?
一般web系统中的状态是指两个相互关联的用户交互操作保留某种公共信息,例如用户登录信息,工作流等。这些信息具有不同作用域,如page,request,session,application等。通常由服务器负责保存这些信息。
2、 为什么restful 需要无状态?
无状态请求易于实现负载均衡。在分布式web系统下,有多个可用服务器,每个服务器都可以处理客户端请求。如果是有状态的话,则只能保存了用户状态的那台服务器能够响应,除非状态在服务器间是共享的。
无状态请求有较强的容错性和可伸缩性。如果一台服务器宕机,无状态请求可以透明地交由另一台可用服务器来处理。
这些因素导致了一般restful接口采用无状态。
3、shiro怎么实现restful 无状态鉴权?
3.1 无状态鉴权的最基本的两点:
- 无状态鉴权,每次请求都必须带入鉴权信息,以供服务器端验证。
- 服务器端不保存请求的状态。
3.2 需要解决的问题
- 无状态每次都传鉴权信息,如何防止信息挟持和重发攻击。
大致的解决思路:
1)客户端事先在服务器注册,产生客户端的用户名和密码,比如 admin,123456.
2)客户端每次请求都需要带上用户名,请求的数据通过密码做消息摘要,并将摘要一并传递到服务器。
3)服务器端根据用户名admin,查找其对应的密码,然后根据密码对请求数据做摘要(客户端与服务器端算法要一致),然后比对客户端传过来的摘要与服务器生成的摘要是否相同。相同则鉴权成功,不同则失败。
整个请求过程中,并没有涉及到密码的传递,相对来说可以防止信息挟持。
但是存在重发攻击的风险,别人仿照用户发起相同的请求,那么就会造成安全隐患。
解决方式:
在客户端请求参数中加入唯一的随机数,服务器每次都会解析并保存该唯一随机数,当发现该唯一随机数存在时,则判定为重发攻击。
以上简述了大致的流程,接下来就是代码时刻。
网友评论