token、cookie与session

2020-07-14  本文已影响0人  卿酌南烛_b805

1.简单介绍 

 token(令牌): 

token是用户身份的验证方式,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。还可以把不变的参数也放进token,避免多次查库

2.传统身份验证

HTTP是一种没有状态的协议,并不知道谁是访问者。假设一个客户端访问服务端时发送账号密码,通过验证。下回它再次访问时,还是需要验证。

解决办法(session+cookie):

1)客户端访问时,通过了验证。

2)服务端生成一条记录,记录一些必要信息。

3)把记录这些信息的ID号发送给客户端

4)客户端收到ID号后存储在cookie中

5)下次客户端重新访问服务端时,带上cookie信息

6)服务端验证cookie里面的信息,如果能找到对应的记录,则用户通过了验证

3.token身份验证

1)客户端使用账号密码请求登录

2)服务端收到请求,验证账号密码

3)验证通过,服务端签发一个token给客户端

4)客户端收到token存储起来(例:存在cookie)

5)客户端每次请求服务端时带着服务端签发的token

6)服务端收到请求,验证token。验证成功则返回数据给客户端

4.常见问题

1.服务器上的token存储到数据库中,每次查询会不会很费时?

如果存储到数据库中会造成系统的性能问题,可以放在内存中

2.客户端得到的token需要如何处理?

i.在存储的时候把token对称加密

ii.将请求url、时间戳、token三者合并加盐签名,服务器验证有效性

cookie:

cookie是大多数Web应用程序所依赖的HTTP协议的一个关键组成部分,攻击者常常通过它来

利用Web应用程序中的漏洞。服务器使用cookie机制向客户端发送数据,客户端保存cookie并将其返回给服务器。与其他类型的请求参数(存在于URL查询字符串或消息主体中)不同,无须应用程序或用户采取任何特殊措施.随后的每一个请求都会继续重新向服务器提交cookie:

如前所述.服务器使用Set-Cookie响应消息头发布cookie:

      Set-Cookie:  tracking=tI8rk7joMx44S2Uu85nSWc

然后.用户的浏览器自动将下面的消息头进行添加,随后返回给同一服务器的请求中:

  Cookie:  tracking=tl8rk7joMx44S2Uu85nSWc

如上所示.cookie一般由一个名/值对构成,但也可包含任何不含空格的字符串。可以在服务

器响应中使用几个Set-Cookie消息头发布多个cookie.并可在同一个Cookie消息头中用分号分隔不同的cookie,将它们全部返回给服务器。

除cookie的实际位外,Set-Cookie消息头还可包含以下任何可选属性,用它们控制浏览器处理cookie的方式。

 expires。用于设定cookie的有效时间。这样会使浏览器将cookie保存在永久性的存储器中,在随后的浏览器会话中重复利用.直到到期时间为止。如果没有设定这个属性,那么cookie仅用在当前浏览器会话中。

 domain。用于指定cookie的有效域。这个域必须和收到cookie的域相同,或者是它的父域。

 path。用于指定cookie的有效URL路径。

 secure。如果设置这个属性.则仅在HTTPS请求中提交cookie.

 HttpOnly。如果设置这个属性,将无法通过客户端JavaScript直接访问cookie.

    上述每一个cookie属性都可能影响应用程序的安全.其造成的主要不利影响在于攻击者能够

直接对应用程序的其他用户发动攻击。



session:

解释session:当访问服务器否个网页的时候,会在服务器端的内存里开辟一块内存,这块内存就叫做session,而这个内存是跟浏览器关联在一起的。这个浏览器指的是浏览器窗口,或者是浏览器的子窗口,意思就是,只允许当前这个session对应的浏览器访问,就算是在同一个机器上新启的浏览器也是无法访问的。而另外一个浏览器也需要记录session的话,就会再启一个属于自己的session

原理:HTTP协议是非连接性的,取完当前浏览器的内容,然后关闭浏览器后,链接就断开了,而没有任何机制去记录取出后的信息。而当需要访问同一个网站的另外一个页面时(就好比如在第一个页面选择购买的商品后,跳转到第二个页面去进行付款)这个时候取出来的信息,就读不出来了。所以必须要有一种机制让页面知道原理页面的session内容。

问题:如何知道浏览器和这个服务器中的session是一一对应的呢?又如何保证不会去访问其它的session呢?

原理解答:就是当访问一个页面的时候给浏览器创建一个独一无二的号码,也给同时创建的session赋予同样的号码。这样就可以在打开同一个网站的第二个页面时获取到第一个页面中session保留下来的对应信息(理解:当访问第二个页面时将号码同时传递到第二个页面。找到对应的session。)。这个号码也叫sessionID,session的ID号码,session的独一无二号码。

session的两种实现方式(也就是传递方式):第一种通过cookies实现。第二种通过URL重写来实现

第一种方式的理解:就是把session的id 放在cookie里面(为什么是使用cookies存放呢,因为cookie有临时的,也有定时的,临时的就是当前浏览器什么时候关掉即消失,也就是说session本来就是当浏览器关闭即消失的,所以可以用临时的cookie存放。保存再cookie里的sessionID一定不会重复,因为是独一无二的。),当允许浏览器使用cookie的时候,session就会依赖于cookies,当浏览器不支持cookie后,就可以通过第二种方式获取session内存中的数据资源。

第二种方式的理解:在客户端不支持cookie的情况下使用。为了以防万一,也可以同时使用。

如果不支持cookie,必须自己编程使用URL重写的方式实现。

  如何重写URL:通过response.encodeURL()方法

      encodeURL()的两个作用

        第一个作用:转码(说明:转中文的编码,或者一些其他特殊的编码。就好比如网页的链接中存在中文字符,就会转换成为一些百分号或者其他的符号代替。)

第二个作用:URL后面加入sessionID,当不支持cookie的时候,可以使用encodeURL()方法,encodeUTL()后面跟上sessionID,这样的话,在禁用cookie的浏览器中同时也可以使用session了。但是需要自己编程,只要链接支持,想用session就必须加上encodeURL()。

提示:若想程序中永远支持session,那就必须加上encodeURL(),当别人禁用了cookie,一样可以使用session。


不同点:

1、cookie与session的区别

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用COOKIE。

4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

5、所以个人建议:将登陆信息等重要信息存放为SESSION

其他信息如果需要保留,可以放在COOKIE中

上一篇 下一篇

猜你喜欢

热点阅读