文章目录



cookie、session 和 token

cookie(保存在客户端的状态信息)


  • cookie 技术的产生
    在无状态服务器发展的过程中,逐渐产生了 cookie 技术,这相当于无状态向有状态过渡的过程,但 web 服务器请求依旧是无状态请求,cookie 是一个拓展,能将状态信息保存到客户端
  • cookie 存储
    客户端登陆网页之后,服务端返回 set_cookie,浏览器保存下来,默认情况下浏览器会将 cookie 保存到内存中,浏览器不关闭,cookie 就能起作用,进行后续点击页面请求,就能取出这个 cookie 作为请求头中的参数传过去,这个内存中的 cookie 在这里我不是指那个浏览器设置中存下来的有哪些 cookie,那些 cookie 是已经写到磁盘了。cookie 只能识别 ascll 码不能识别中文,所以要存储中文,需要弄成 ascll 码形式。cookie 限制存储 4kb
  • 安全性
    最好不要使用 cookie 存储隐私数据,以防隐私泄露。存在被截获的风险
  • 实际使用描述
    当我进行一个网页登录之后,服务器接到请求响应,将少量数据通过 set_cookie 响应头的方式发送给客户端,然后浏览器便会把这些数据保留下来,这样我在对自己登陆后的页面进行后续操作时,会将这个 cookie 作为请求头中参数发送给服务端,服务器就能知道是哪个用户在进行请求了,这样服务端就可以返回该用户的其他页面了。我们可以抓取客户端请求服务端的请求头中看到 Cookie 字段
    第一次用户密码登录后,服务器响应头含有​​Set-Cookie:PHPSESSID=nj1tvkclp3jh83olcn3191sjq3​
  • 形象比喻
    使用 cookie 技术的一系列请求操作就好像,当你一个人要进出境去日本的时候,你需要提交自己的用户密码给海关,然后海关用你的用户密码以及身份信息制作一张护照,然后海关记住每张护照是和哪个用户名是对应的,并且这些护照是有过期时间的,你第一次一过境他就会把护照发给你,你之后每次过境去日本时都需要出示一下护照给海关,海关自己核查,核查是该护照对应的用户就成功放行去日本(你自己的用户页面),如果你偷偷拿了别人的护照,海关一查,该护照信息是正确存在的并且该护照对应的用户应该是前往美国的,他就会放行你去美国(别人的用户页面)
  • 谷歌调试
    登录之后我们可以在谷歌调试器的 Application 中的 Storage 一栏中的 Cookies 中找到指定域名的 cookie 字段,cookie 是按照域名划分的,所以丝毫不用担心不同域名传错 cookie
  • 应用场景
    如浏览器中 cookie 含有用户密码信息,这样以便下次登录能够直接进入页面。还有购物时候,可以将用户购买的商品信息存入 cookie,之后付款再从 cookie 中拿到商品信息

session(保存在服务端的状态信息)


  • session 技术
    session 又称会话信息,session 是将状态信息保存到服务器,使用上比 cookie 简单些,但也相应增加了服务器的压力。只有在用户第一次访问服务器时候服务器自动创建 session,而且只有是访问 jsp,servlet 等程序时才会创建 session,访问静态资源并不会创建 session。session 虽然存在服务器中,但是对客户端却是透明的,它的正常运行仍需要 cookie 的支持。http 协议是无状态协议,session 不能依据两次独立的 http 连接请求来判断第二次连接和第一次连接时同一个用户的请求,因此服务端会向客户端发送一个 sessionid 的 cookie,值是当前话术的 id,即​​HttpSession.getId()​​的返回值,该 cookie 服务端产生,浏览器多窗口间不能共享,
  • session 存储
    session 存储在服务端,并且没有 4kb 限制,是无限的,session 存储在服务器是需要空间的,
  • 安全性
    cookie 可以轻松截获,session 由于保存在服务端,因此其更安全。依然存在被截获的风险
  • 实际使用描述
    当我进行一个网页登录之后,服务端会把登录信息保存成一个话术,然后将话术的 id 封装成 cookie 在响应头处返回给客户端,客户端拿到之后,以后的每次请求头中会带有这个 session id 的 cookie 访问服务器
    如第一次用户密码登录后,服务器响应头含有:​​Set-Cookie JSESSIONID=nj1tvkclp3jh83olcn3191sjq3​
  • 形象比喻
    使用 session 技术的一系列请求就好像是,当你一个人要出境去日本时,你需要提交的你的用户名和密码给海关,海关依据你的用户名和密码以及身份信息制作成一张护照,并且这张护照含有一个唯一的护照号码,护照由海关保留,所以当很多人出境时候,你能看到海关身上挂满了各种护照本,他不堪重负,当你第一次一过境时,他就会把你的护照号码告诉你,但他不会给你护照本,你只需要记住护照号码,然后你每次出境去日本的时候,向海关说出自己护照号是多少就行了,海关自己会把自己身上挂满的护照本一一核对,这样你就可以通行去日本了(你自己的用户页面)!因为护照本是在海关身上,别人很难从海关身上偷东西!
  • 应用场景
    要是服务器做了负载均衡,请求请求定向到另一台服务器时候,session 就会丢失。

token(身份认证的唯一标识)


  • token 技术
    token 即为令牌,表示用户身份的标志,用户第一次登陆后会自动请求服务器的 token 接口,服务器会依据用户 id 生成一个唯一的 token,将此 token 在 token 接口的响应体中返回,之后浏览器保存下 token,之后客户端请求的请求头中的 authorization 参数中就会自动加上 token 信息,这样后续请求服务器时就能判定是那个用户在操作页面了
  • token 存储
    存储在客户端浏览器中 cookie 或者 local storage 中
  • 安全性
    使用最广泛,依然存在被盗用的风险
  • 实际使用描述
    客户端登陆用户密码之后,登陆成功后会自动出发后端的 token 接口,该接口会将用户 id 通过加密算法弄成 token 形式,并将 token 放在响应体中返回给客户端,客户端接收到 token 接口响应体中的 token 信息之后,保存到浏览器中,之后每次客户端的页面请求,会在请求头的 authorization 参数中加上 token,然后服务器接收到这个 token 对其进行解密和识别身份,这样就可以做到后续的请求能访问指定的用户页面
  • 形象比喻
    由于前些日子出境的人数太多了,海关身上挂满了护照本,海关不堪重负,他想换种方式来解决出境的问题。今天你来了,你今天想要出境去日本,向海关告知了用户和密码,并请求海关返回给你编码后的身份信息,于是海关使用了一张摩斯码表将你告知的用户 id 进行编码,并在你一出境的时候就告知你,你记住了这个编码后的身份标识,以后你每次出境去日本的时候,你直接把这个编码后的身份标识告知海关,海关就会对着摩斯码表翻译,认证你这个用户是不是存在的合法的,是的话你就可以出境去日本了!虽然海关检查出境人员的速度没有之前快了,但是海关也不用挂满护照本那么不堪重负了!并且由于使用了摩斯码表对身份信息进行了编码,所以不怕别人偷窥到个人的身份信息了!虽然和 sessionid 一样依然存在当海关把信息告知你的时候信息被截获这一风险,但好歹海关轻松了很多!
  • 谷歌调试
    登录之后我们可以在谷歌调试器的 Application 中的 Storage 一栏中的 Local Storage 或 Session Storage 中
  • 应用场景
    在当下 web 领域 token 身份认证可以说是使用最广的了,支持无状态协议,支持移动设备,安全等