java web 认证方式,Java Web学习(五)认证机制三巨头--session、cookie、token

一、引言

动态网页兴起后,会话管理变成开发者需要考虑的一个问题,由于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去缓存中校验是否存在。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值