码迷,mamicode.com
首页 > 编程语言 > 详细

Java Web学习(五)认证机制三巨头--session、cookie、token

时间:2019-08-23 19:06:57      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:san   验证方式   nbsp   sig   ESS   request   当前时间   限制   session失效   

一、引言

  动态网页兴起后,会话管理变成开发者需要考虑的一个问题,由于HTTP请求是无状态的,为了区分每个用户,此时引入了会话标识(session id)的概念,但是存储机制也会产生不同的问题,下面就详细分析一下三种机制的优缺点以及使用方式。

二、session

定义:会话,打开web应用时产生,浏览器第一次访问服务器会在服务器端生成一个session,有一个sessionid和它对应。

创建:session在访问tomcat服务器时调用HttpServletRequest.getSession(true)创建。(此时对应的sessionid也同时产生)

存储:session的状态信息等储存在服务器的内存中,但是sessionid是保存客户端的cookie中,客户端不保存session,session销毁只能通过invalidate或超时失效,关掉浏览器并不会关闭session。

删除:(1)超时;

   (2)程序调用HttpSession.invalidate();

   (3)程序关闭;

存在的问题:(1)负载均衡后,每台机器间的session都需要相互复制,很烦杂

      (2)单独把session拿出来存,又会面临这台存session的服务器一宕机,全部的用户都得重新登陆,凉凉...

常见QA:

Q:浏览器关闭时,session会同时关闭么?

A:session并不会因为浏览器的关闭而删除!关闭浏览器和session失效没有任何关系, session本身有一个存活时间,在tomcat中默认的是30分钟,打个比方即使浏览器一直开着,如果在30分钟内没有发出任何请求, 那原来存在服务器上的session域内的东西就全没有了, 再次访问的时候,服务器会新建一个session。它的改变是通过session.getMaxInactiveInterval()改变的,当关闭浏览器,再打开浏览器访问的时候,服务器会新建一个session,可以通过session的ID来判断是不是新的session,session的失效除了上述的超时,还有调用invalidate() 或者服务器重启或者中断,所以如果当设置session的MaxInactiveInterval为-1(永不超时)时,并且关闭了浏览器,那么你的session会一直存在,除非重启服务器。

 三、cookie

定义:由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到本地某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。

存储:保存在本地客户端

删除:(1)超时;(设置了过期时间,cookie过期后会存储在硬盘里面)

      (2)手动删除;

存在的问题:(1)cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗。

      (2)cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击。

      (3)cookie有大小限制以及浏览器在存cookie的个数也有限制。

四、token

定义:令牌,是一种用户身份的验证方式。

创建:第一次登录后,服务器生成一个Token便将此Token返回给客户端

存储:token一般储存在客户端的cookie中,服务端生成后不保存token(可以存在缓存中),服务端处理每次请求,只做token的校验工作而已。

常见组成方式:uid(用户唯一的身份标识) + time(当前时间的时间戳) + sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。

验证流程:(1)用户通过用户名和密码发送请求。

     (2)程序验证。

     (3)程序返回一个签名的token 给客户端。

     (4)客户端储存token,并且每次用于每次发送请求。

     (5)再次请求时,服务端验证token并返回数据。

PS:第一次登陆时,客户端传账号和密码到服务器,服务器先去查询数据库,查询到用户信息后服务器再根据自己的规则生成token并缓存(如redis等技术),再把token回传给客户端(客户端可以把token存到cookie中)。

    第二次登陆时,直接传token给服务器验证缓存中是否存在该token;也可以传账号密码给服务器,让服务器再次生成一次token,用这次生成的token去缓存中校验是否存在。

Java Web学习(五)认证机制三巨头--session、cookie、token

标签:san   验证方式   nbsp   sig   ESS   request   当前时间   限制   session失效   

原文地址:https://www.cnblogs.com/riches/p/11399123.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!