登录的本质
保持登录状态的方法
基于Cookie、Session的实现
1、login
2、登录服务验证用户密码后生成一个有效的sessionid,同时在内存中创建一个空间(session)来存放于sessionid相关的信息
3、返回一个Set-Cookie的header,将sessionid存入浏览器
4、浏览器在后续的请求中会把sessionid最为请求头重cookid信息携带上
5、服务器根据sessionid在内存中查找到响应的session来获取会话相关信息
基于token安全令牌的
1、客户端调用一个登录服务,而不是每次请求都带着用户名密码
2、登录服务验证用户名密码后生成一个有效的token,存入存储
3、登录服务把token返回给客户端
4、客户端每次请求时携带token来访问
5、服务器通过查询客户端存储来确定客户端是否已经认证过
常见的登录攻击及防护
session Fixation 攻击
1、攻击者首先登录获取session cookie
2、诱骗用户使用攻击者已存在的session cookie进行登录
3、一旦用户登录,攻击者的session中存放的就是用户的信息了,那么攻击者就可以已用户的身份进行操作了
解决办法
if(session!=null){
session.invalidate();
}
request.getSession(true).setAttribute("user",user);
注: 在登录接口调用getSession默认为true,找不到session返回一个新的,传入一个false如果找不到就返回一个null,不会新创建一个,判断是否为空,不为空调用invalidate方法使之失效掉,然后在从新创建
重构代码
protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
System.out