大家好,我是IT修真院北京分院第27期的JAVA学员,一枚正直纯洁善良的java程序员。
今天给大家分享一下,修真院官网Java任务4,深度思考中的知识点—为什么要使用Tiles框架?
什么是cookie?
Cookie,中文名称为“小型文本文件”,指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。
由网景公司的前雇员卢·蒙特利在1993年3月发明。最初定义于RFC 2109。目前使用最广泛的 Cookie标准却不是RFC中定义的任何一个,而是在网景公司制定的标准上进行扩展后的产物。
什么是session?
在计算机科学领域来说,尤其是在网络领域,会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制,session在网络协议(例如telnet或FTP)中是非常重要的部分。
在不包含会话层(例如UDP)或者是无法长时间驻留会话层(例如HTTP)的传输协议中,会话的维持需要依靠在传输数据中的高级别程序。例如,在浏览器和远程主机之间的HTTP传输中,HTTP
cookie就会被用来包含一些相关的信息,例如session ID,参数和权限信息等。
什么是token?
Token 的中文有人翻译成 “令牌”,我觉得挺好,意思就是,你拿着这个令牌,才能过一些关卡。
Token是一个用户自定义的任意字符串。在成功提交了开发者自定义的这个字符串之后,Token的值会保存到服务器后台。只有服务器和客户端前端知道这个字符串,于是Token就成了这两者之间的密钥,它可以让服务器确认请求是来自客户端还是恶意的第三方
直接在Cookie中存信息可谓是上古时代的操作了,在服务器还没有那么便宜的情况下,好多网站选择将用户的登录信息存在cookie中,他们把用户名或者用户id转换并签名之后,直接存入Cookie,如果有其他需要的信息,也是如此操作。转换或签名可以是加盐md5,也可以是使用secret的双向加密。用户第二次访问网站的时候,代码中对这段信息进行验证,看看是否是正确的签名的。这样做的好处是:
不会再占用服务器资源,直接就在cookie中读取数据,获得结果。坏处是:
登录凭据容易被窃取,尤其是那个年代还没有流行https,如果被中间人了,或者以另一种方式拿到了cookie,那就会被窃取登录,另外,每个数据还可能是分开存储的,因此容易被篡改。当然那时的互联网也并没有那么发达,cookie也就存存用户名什么的用于显示。
后来网速变快了,web 应用高速发展,大家意识到了很多问题,cookie 大小不够啊,cookie 每个 key 都这么搞一下暴露太多了等等。从原理上来说,Session 就是
Cookie。客户端进入网站后,服务器分配一个
Session ID 给客户端种入 Cookie,用户登录时,在服务器查询 Session ID,在服务器写入 Session Object,这个对象里存了用户的登录数据,比如 id 啦,用户名啦,登录状态 / 角色等等。
另外分配 Session ID 也可以是懒分配,也就是等到在服务器存 Session Object 的时候再分配也没有关系,Session ID 的分配可以是用 UserID
来进行加密分配,也可以用毫不相关的时间等信息进行加密分配,只需要保证这个
sid 唯一,不容易被伪造即可。Session 的存放也是可重可轻,如果觉得 Session 很重要,那么可以放入 mysql,如果觉得 Session 不怎么重要,甚至可以放入内存,重启丢失。
Session 到至今还是非常非常多的网站在用,原因就是在于其实除了 https 以外的问题,并没有什么问题,IE >= 10 之后,Cookie 也可以跨域,那么 Session 就没有什么问题。
好处是: 在客户端除了 sid 以外,看不到任何信息,当然不太容易篡改。
坏处是: 取 Session 的时候,是会需要再 query 一次的,也容易被窃取,当然这并不是 Session / Cookie 的锅,http下,啥都是一清二楚的。
另外,优缺点都是相对于时代和业务来说的,存 Cookie 的时代服务器的性能不高,也没有 memcache 或者 redis 这种东西,存入 mysql 就需要再 query 一次,负载均衡当然不能同步 内存中的
Session,Cookie 成为了首选,那么现在呢,这点算力恐怕算不了什么,那么 Session 的那个坏处,就应该被划掉,Session 理所当然成为了流行的会话管理方式。Session 和 Cookie
都不需要前端介入,服务端通过
Set-Cookie http 头就可以完成 sid 和 Cookie 的更新。
JWT(JSON Web Token) 代表了把凭据存客户端的思想,和当时的 Cookie 有点像,登录的时候把那些需要的信息
base64 编码作为一段,然后再对这些字段用 secret 进行签名,连起来这么一段 Token 去发给客户端作为凭据。凭据存在客户端的好处是: 登录状态都是跟着客户端跑的,时效信息都存在客户端,Session
如果过期了,要对
Session 数据库进行垃圾清理,那么凭据存在客户端就不需要,丢了就是登出。因为都是跟着客户端跑的,在服务器扩大搞集群,搞异地多活,就不需要考虑读数据库这种事情,因为都是客户端请求为 based ,随便哪个服务器来
handle
请求都没有问题。凭据存客户端坏处是: 当凭据内容越来越多,Token 也会越来越长,每一次请求都会携带这么大这么长的内容,显然不是非常合适。JWT 还有个问题就是中间那部分是 base64
编码的,如果熟悉标准的话,等于就是明文存储凭据了,虽然不能改,当然还是能看到。Token 类的鉴权需要前端参与并存储,存储一般会放在 localStorage 等地方,因此其实是比较容易受到 XSS 的影响。Cookie类的鉴权容易受到CSRF 的影响。
使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:
客户端使用用户名跟密码请求登录
服务端收到请求,去验证用户名与密码
验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
1)Cookie有属性吗?都是什么?
答:Cookie有属性,它们是:
1. String「name」 :该Cookie的「名称」。Cookie一旦创建,名称便不可更改。
2. Object「value」:该Cookie的「值」
3.Int「maxAge」:该Cookie的「失效时间」,单位秒注:如果为正数,则该Cookie在maxAge秒后失效。如果为负数,则该Cookie为临时Cookie,关闭浏览器即失效。如果为0,表示删除该Cookie。默认为-1,即关闭浏览器即失效
4.Boolean「secure」:「是否仅使用安全协议传输」,默认为false
5.String「path」:该Cookie的「使用路径」注:如果设置为“/shit/”,则只有“http:http://xxx.xxx.xxx/shit”的程序可以访问该Cookie。如果设置为“/”,则本域名下的程序都可以访问Cookie,注意最后一个字符必须为“/”。
6.String「domain」:「可以访问该Cookie的域名」。注:如果设置为".http://google.com",则所有以"http://google.com"结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”。
7.String「comment」:该Cookie的「用处说明」,用来再浏览器显示Cookie信息的时候显示该说明。
8.Int「version」:该Cookie的「版本号」。0表示遵循Netspace的Cookie规范,1表示遵循W3C的RFC2109规范。
2)cookie有什么用?
答:挺多的,列举几个。自动登陆:第一次登陆成功后,给你的电脑发送一个存有你用户名的Cookie。
于是,在Cookie失效之前,你每一次登陆服务器,服务器都会直接读取你的Cookie中的用户名,然后返回给你一个登陆成功的页面。
挺危险的是吧,所以通常会有一些加密手段以及借助Session的帮助。京东未登录时的购物车:意思差不多,诸位应该明白。
3)通俗说Session
答:Session是「你去理发店办卡后,店家记录你剩余次数的那个大本子」。它保存在服务器端,不负责记录你还能剪几次,但是它会把客户端的某种信息保存在服务器上。当客户端下一次来访问时,根据信息确定客户身份即可。
1)面试经典问题:Cookie禁用了,Session还能用吗?
解答:"https://segmentfault.com/q/1010000007715137"
https://www.zhihu.com/topic/19616699/top-answers
https://my.oschina.net/xianggao/blog/395675
http://www.10tiao.com/html/169/201803/2650825233/1.html
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~