HTTP 协议是无状态的,因此想要实现保存用户数据或辨别用户身份就要使用今天所要说的内容。

cookie:

Cookie已经在前面说过,Cookie是保存在客户端的一个文本文件。

但仅通过cookie就可以辨别用户了吗?
显然是不行的,因为它保存在客户端,可以被人修改绕过验证。

document.cookie = "status=" +"true";

当浏览器发送请求时,cookie就会被发送。

Session:

对于服务器而言,可以将会话以key-value的形式储存到服务器,当客户端发送请求时以种cookie的方式将key发送到客户端。客户端收到后将key保存到cookie中的sessionID中。
当下一次客户端发送请求时,再将cookie带上,将sessionID和服务器的value验证。

这确实是一个非常好的方案,但它的弊端是占用空间,当用户数量越来越多,随之储存的数据也越来越多。

因此,Cookie和Session的区别在于储存在服务器还是客户端

Token:

经过CookieSession后我们知道,前者不安全,后者占内存。而Token的出现就解决了这个问题。

由于Token是无状态的,所以不需要储存信息,解决了Session的问题;通过签名加密,解决了Cookie不安全的问题。

JSON Web Token简称JWT,它以JSON的形式储存,结构有三部分:

  • 头部(Header):储存类型和加密算法
  • 负载(payload):需要储存的信息
  • 签名(signature):将头部和负载加密

使用Token时,服务器向浏览器发送一个通过私钥生成Token,客户端收到加密的Token将其保存。每次发送请求时带上Token。服务器收到请求使用公钥解密验证。

上面我们明白了Token的优势以及传输方式,那公钥和私钥从哪里来的呢?

对称加密&非对称加密:

这里涉及到加密算法中的对称加密和非对称加密。而Token使用的签名就是非对称加密。

对称加密:

对称加密也叫私钥加密,加密解密过程如下:

  • 通过私钥对明文进行加密,输出密文。
  • 通过私钥读密文进行解密,输出明文。

对称加密速度较快,但由于双方使用同一个密钥,安全性一般。

非对称加密:

采用公钥-私钥的方式进行加密。而且只有同一个公钥-密钥才可以正常加密解密。加密解密过程如下:

  • 获取公钥对明文进行加密,输出密钥。
  • 使用对应的私钥对密文进行解密,输出明文。

公钥是私有的,保证了信息是从唯一的位置发送;公钥是公开的,只有公钥才能解密。因此公钥用来签名,私钥用来验证签名。
由于非对称加密需要协商加密,因此速度比对称加密慢得多,但安全性较好。

解决了加密的问题,那客户端接收到的Token应该保存在哪里?

Web Storage

这两个概念是HTML5中被提出,提供除Cookie之外的在客户端储存数据的途径。其中分类两类:

  • localStorage:永久保存,只有手动删除时才清除,且在同源窗口共享。
  • sessionStorage:浏览器或页面关闭时清除。

区别于Cookie

异同 Cookie localStorage sessionStorage
大小 4kb 5M 5M
通信 携带在HTTP请求内 仅存储在客户端 仅存储在客户端
生命周期 默认关闭浏览器失效 永久保存,只能手动清除 关闭浏览器失效

无论使用以上哪种方式存储信息,都要注意XSS攻击。

更多内容请看:IFTS