本文通过文章和视频学习总结
转载:点击跳转至学习文章
转载:视频学习地址
一、Cookie与Session
1.1、Session的概念
Cookie数据保存在客户端,Session是存放在服务端的。
1.2、会话
浏览器访问服务器就是会话的开始,比较模糊的就是会话结束的时间。因为当你关掉网页,或许只是你按错了,导致会话的结束。因此不同的网站对于每个用户的会话都设定了时间以及唯一的ID。这个时间就是会话结束的时间,ID就是SessionID。
1.3、Session的概念
Session是存放在服务器的,类似于Session结构来存放用户数据,当浏览器第一次发送请求时,服务器自动生成了一个Session和一个SessionID用来唯一标识这个Session,并将其通过响应发送到浏览器。
当浏览器发送第二次请求,会将前一次服务器响应中的SessionID放在请求中一起发送到服务器上,服务器从请求中提取SessionID,和保存的所有SessionID进行对比,找到这个用户对应的Session。
1.4、服务器验证Session
(1)服务器会把用户第一次请求得到的Session信息序列化后保存起来,以后服务器通过用户请求得到的SessionID,直接和数据库中所有的SessionID进行对比,找到这个用户对应的Session。这样的好处是没了时间的限制,坏处是随着时间的增加,这个数据 库会急速膨胀,特别是访问量增加的时候。一般还是采取后一种方式,以减轻服务器压力。
(2)浏览器第一次访问服务器的时候,程序员可以将用户的一些数据以Key和Value的形式暂时存放在这个Session。以后服务器通过浏览器请求的Session中设定的数据来判断用户是否是登录状态。
下面代码截屏于视频学习中
测试:第一次登陆可以看到服务器生成的sessionID
但是第一次登陆的时候,请求的时候是没有cookie的
当我们再次登录,请求中就携带了cookie
1.5、Session的客户端实现形式(即Session ID的保存方法)
一般浏览器提供了两种方式来保存,一种是Cookie,还有一种是程序员使用html隐藏域的方式自定义实现:
(1)使用Cookie来保存,这是最常见的方法。服务器通过设置Cookie的方式将SessionID发送到浏览器。如果我们不设置这个过期时间,那么这个Cookie将不存放在硬盘上,当浏览器关闭的时候,Cookie就消失了,这个SessionID就丢失了。
如果我们设置这个时间为若干天后,那么这个Cookie会保存在客户的硬盘中,即使关闭了这个浏览器,这个值仍然存在,下次我们访问相应网站时,同样会发送到服务器上。
(2)使用URL附加信息的方式,也就是像我们经常看到JSP网站会有aaa.jsp?JSESSIONID=*一样的。这种方式和第一种方式里面不设置Cookie过期时间是一样的。
(3) 第三种方式是在页面表单里面增加隐藏域,这种方式实际上和第二种方式一样,只不过前者通过GET方式发送数据,后者使用POST方式发送数据。但是明显后者比较麻烦。
1.6、Session和Cookie区别
(1)cookie数据保存在客户端,session数据保存在服务器端。
(2)如果web服务器端使用的是Session,那么所有的数据都保存在服务器上面,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一SessionID提交到服务器端,服务器根据当前sessionID判断相应的用户数据标志,以确定用户是否登录,或者具有某种权限。
由于数据是存储在服务器上面,所以你不能伪造,但是如果你能够获取某个登录用户的sessionID,用特殊的浏览器伪造该用户的请求也是能够成功的。sessionid是服务 器和客户端链接时候随机分配的,一般来说是不会有重复,但如果有大量的并发请求,也不是没有重复的可能性。
(3)如果浏览器使用的是cookie,那么所有的数据都保存在浏览器端,比如你登录以后,服务器设置了cookie用户名(username),那么当你再次请求服务器的时候,浏览器会将username一块发送给服务器,这些变量有一定的特殊标记。服务器会解释为cookie变量。所以只要不关闭浏览器,那么cookie变量便一直是有效的,所以能够保证长时间不掉线。
如果你能够截获某个用户的 cookie变量,然后伪造一个数据包发送过去,那么服务器还是认为你是合法的。所以,使用 cookie被攻击的可能性比较大。
如果设置了的有效时间,那么它会将 cookie保存在客户端的硬盘上,下次再访问该网站的时候,浏览器先检查有没有 cookie,如果有的话,就读取该 cookie,然后发送给服务器。
如果你在机器上面保存了某个论坛 cookie,有效期是一年,如果有人入侵你的机器,将你的 cookie拷走,然后放在他的浏览器的目录下面,那么他登录该网站的时候就是用你的的身份登录的。所以 cookie是可以伪造的。当然,伪造的时候需要主意,直接copy cookie文件到 cookie目录,浏览器是不认的,他有一个index.dat文件,存储了 cookie文件的建立时间,以及是否有修改,所以你必须先要有该网站的 cookie文件,并且要从保证时间上骗过浏览器。
(4)如果使用Cookie方式,一旦客户端禁用Cookie,那么Session也会失效。
(5)服务器也可以通过URL重写的方式来传递SessionID的值,因此不是完全依赖Cookie。如果客户端Cookie禁用,则服务器可以自动通过重写URL的方式来保存Session的值,并且这个过程对程序员透明。
(6)可以试一下,即使不写Cookie,在使用request.getCookies();取出的Cookie数组的长度也是1,而这个Cookie的名字就是JSESSIONID,还有一个很长的二进制的字符串,是SessionID的值。
1.7、Cookies与Session的应用场景
(1)Cookies是属于Session对象的一种。但有不同,Cookies不会占服务器资源,是存在客服端内存或者一个cookie的文本文件中;而“Session”则会占用服务器资源。
(2)Cookies的安全性能一直是倍受争议的。虽然Cookies是保存在本机上的,但是其信息的完全可见性且易于本地编辑性,往往可以引起很多的安全问题。所以Cookies到底该不该用,到底该怎样用,就有了一个需要给定的底线。
(3)使用Cookies改有个底线。这个底线一般来说,遵循以下原则:
- 不要保存私人信息。
- 任何重要数据,最好通过加密形式来保存数据(最简单的可以用URLEncode,当然也可以用完善的可逆加密方式,遗憾的是,最好不要用md5来加密)。
- 是否保存登陆信息,需有用户自行选择。
- 长于10K的数据,不要用到Cookies。
- 也不要用Cookies来玩点让客户惊喜的小游戏。
(4)“购物车”中类的处理和设计。用户可能在一段时间内在同一家网站的不同页面选择不同的商品,可以将这些信息都写入cookie,在最后付款时从cookie中提取这些信息,当然这里面有了安全和性能问题需要我们考虑了。
二、基于JWT的Token认证
JWT(JSON Web Token)
2.1、简介:
浏览器第一次登陆服务器后,服务器会生成JWT,服务器不会保存JWT,只会保存JWT签名的密文。接着把JWT发送给浏览器,可以让浏览器以Cookie或者Storage的形式存储。
假设以cookie的形式存储,以后浏览器每次发送请求都会把JWT发送给服务器,用户就不用重新输入账户和密码了,和session很类似,只不过Token存储在浏览器而已,
2.2、token组成:
header.payload.signature
header:header部分声明需要用什么算法来生成签名
payload:是一些特定的数据,比如有效期之类的
signature:签名信息
header和payload两部分的内容会经由Base64编码,再通过服务器保存的密码,这段密码要结合着两段编码进行算法(header声明的算法)运算,最终得到签名信息。签名信息也就是signature。这样一个完整的jwt就可以发送给客户端了。
2.3、编码验证
浏览器第一次登陆
浏览器再次访问服务器页面
总结:
Token是诞生在服务器,但是保存在浏览器这边的,由客户端指导一切,可以放在Cookie或者Storage里面。持有Token就像持有“令牌”一样可以允许访问服务器