Http协议是什么?
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。简单的说,它是基于现在B/S架构上,出现的一个请求-响应协议。它通常是运行在TCP上,指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。Http协议它有一个很重要的特点是无状态。无状态就是指它这个协议是没有记忆能力的。你在上一个请求发送的信息,如果在下一个请求中也想获取,就要重新发送。举个例子,假如你现在通过登录界面登录,进入了主界面,但是主界面想要获取你是用个账号登录的,那就要重新发送一次你在登录页面输入的账号密码,这样明显是不合理的。所以后面提到的cookie、session、token都是为了解决这个问题。
cookie是什么?
cookie简单的说,就是由服务器生成,传输到本地浏览器,浏览器以key-value的形式存储到它本地目录下面的一种数据。当你再次访问同一个网站的时候,浏览器就会把cookie传输到服务器端,这样就可以解决了Http协议的无状态问题。但是cookie它也存在缺点,一是浏览器存储的cookie是有限的,不是无限的,每个域只能存储有限的cookie。但更重要的是第二点,cookie是不安全的。为什么呢?因为cookie存储在本地浏览器里,所以当你电脑被非法程序入侵的时候,有可能被窃取。所以cookie一般不用来存储比较重要信息,例如密码等。
session是什么?
与cookie不同,session是把数据存储在服务器端。不同的浏览器发送请求到服务器端的时候,都会获得一个独一无二的身份标识,我们可以把它们称作sessionid。当你要存储数据的时候,服务器就会根据你的sessionid在服务器端开辟一个内存空间来存放数据,同时把内存空间的地址通过cookie的形式返回到浏览器保存。当你下一个请求需要调用数据的时候,服务器就会根据你cookie存储的内存空间地址来到内存中,找到对应session拿出数据。当你关闭浏览器的时候,服务器端的session也会被摧毁。但是session也存在缺点,因为session是存储在服务器端的,所以存储的session不能过多,太多就会过分占用服务器端的内存,同时降低服务器的性能。其次,在服务端布置了负载均衡的时候,session就会存在丢失问题。负载均衡,简单的说就是为了避免服务器出现访问量过大而出现崩溃的时候,访问量过大的服务器,就会把请求转发到压力比较小的服务器中。举个例子,你上一个请求在A服务器存储了session,当你的请求转发到B服务器,你去B服务器是找不到A服务器存储的session数据的,这样就会产生session丢失的问题。
token是什么?
token是用户登录后,服务器端根据加密算法把加密后的数据做成一个凭证,这个凭证存储在浏览器端,用户每次请求只要带上这个凭证,就能通过服务器的验证,得到服务器的响应。token相对session它解决了负载均衡产生的session丢失问题。因为token是存储在客户端的凭证,当请求被转发到另外一个服务器时,服务器通过解密token,也可以获得数据。而token和cookie不同的是,token其中包括了验证机制,而cookie只是存储机制。cookie只是把服务器端返回的数据存储起来,而token除了把数据加密保存以外,还有验证登录的功能,这是cookie不具备的。因为token是存储在浏览器端的,虽然被加密了,也有被窃取的风险。为了加强安全性,我们可以设置token的时效性,设置token过期的时间不宜过长。同时,可以通过https加密协议传输token,避免抓包导致token泄露。同时token里面,是有设置有效载荷、sessionid等等信息的,就是为了防止非法程序篡改token,或者使用token在另外的浏览器访问网站。