cookie, session, token的区别

计算机网络

cookie, session, token的区别

  • 为什么会有cookie, session, token

  • 因为http协议是无状态的, 所谓的无状态就是不记录你的任何信息. 自然也不包含你的登录成功信息, 那么你第一次登录成功了, 那我下一次请求怎么知道你登录成功了, 怎么知道你还是哪个用户? 这就产生了cookie, session, token技术

  • cookie
    • 客户端和服务端都能生成cookie

    • 客户端存储, 键值对(value只能是字符串), 一般存储的是一些不敏感的内容, 比如历史记录(比如爱奇艺提示你看到多少集, 比如京东用户名(每次打开京东都会有用户名存在, 要下单的时候却让你登录))

    • 常用方法

      • response.addCookie(new Cookie(k,v))
      • request.getCookies();
    • 不支持跨域, 比如百度服务器给浏览器客户端生成的Cookie, 他是不会到由Google服务器为浏览器客户端生成的Cookie里面去的.

    • 除了name与value之外,Cookie还具有其他几个常用的属性。每个属性对应一个getter方法与一个setter方法。Cookie类的所有属性如表1.1所示。

      表1.1 Cookie常用属性

      属 性 名描 述
      String name该Cookie的名称。Cookie一旦创建,名称便不可更改
      Object value该Cookie的值。如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码
      int maxAge该Cookie失效的时间,单位秒。如果为正数,则该Cookie在maxAge秒之后失效。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为–1
      boolean secure该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false
      String path该Cookie的使用路径。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”
      String domain可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”
      String comment该Cookie的用处说明。浏览器显示Cookie信息的时候显示该说明
      int version该Cookie使用的版本号。0表示遵循Netscape的Cookie规范,1表示遵循W3C的RFC 2109规范
  • Session

    • 服务端生产sessionID和值, 可以存储任意数据类型

    • session是客户端和浏览器第一次登录是创建的. 可以用request.getSession(), 获取这个连接产生的session, 他本质也是键值对

    • 常用方法

      • HttpSession session = request.getSession();
      • session.setAttribute(key, value)
      • session.setMaxInactiveInterval(long)
      • session.invalidate();
    • 用户登录成功后服务端生成一个唯一的id, 然后会写给客户端(因为服务端会对应很多客户端请求, 会以cookie的方式放回客户端, 然后客户端在发送这个唯一的sessionID给服务端, 服务端根据这个sessionID去验证session是否正确,)

    • 虽然Session保存在服务器,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持。这是因为Session需要使用Cookie作为识别标志。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。

      该Cookie为服务器自动生成的,它的maxAge属性一般为–1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。

      因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。

      注意:新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。例如,在链接上右击,在弹出的快捷菜单中选择“在新窗口中打开”时,子窗口便可以访问父窗口的Session。

    • 当多个客户端执行程序时,服务器会保存多个客户端的Session。获取Session的时候也不需要声明获取谁的Session。Session机制决定了当前客户只会获取到自己的Session,而不会获取到别人的Session。各客户的Session也彼此独立,互不可见

    • Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session

    • 流程图

      • image-20200531181921465
    • 表1.2 HttpSession的常用方法

      方 法 名描 述
      void setAttribute(String attribute, Object value)设置Session属性。value参数可以为任何Java Object。通常为Java Bean。value信息不宜过大
      String getAttribute(String attribute)返回Session属性
      Enumeration getAttributeNames()返回Session中存在的属性名
      void removeAttribute(String attribute)移除Session属性
      String getId()返回Session的ID。该ID由服务器自动创建,不会重复
      long getCreationTime()返回Session的创建日期。返回类型为long,常被转化为Date类型,例如:Date createTime = new Date(session.get CreationTime())
      long getLastAccessedTime()返回Session的最后活跃时间。返回类型为long
      int getMaxInactiveInterval()返回Session的超时时间。单位为秒。超过该时间没有访问,服务器认为该Session失效
      void setMaxInactiveInterval(int second)设置Session的超时时间。单位为秒
      void putValue(String attribute, Object value)不推荐的方法。已经被setAttribute(String attribute, Object Value)替代
      Object getValue(String attribute)不被推荐的方法。已经被getAttribute(String attr)替代
      boolean isNew()返回该Session是否是新创建的
      void invalidate()使该Session失效
  • token
    • 为什么有session之后之后又出来了token这个东西

      • session会存储在服务器端, 对于现在的高并发系统明显不合适, 所以token 产生, token不会再服务端存储,
      • 比如用户登录, 会根据用户名和密码生产一个签名(其实和md5的思想一致), 然后把这个生成的token返回以请求头或者cookie方式给客户端,
      • 客户端的每一次请求都带着token(和session一样道理), 服务端接受到这个token, 会根据用户名和密码再次生成签名, 如果签名和第一次的一致, 这说明这个用户名和密码没有被篡改, 验证通过.
    • 流程图

      • image-20200531191957934
    • token的结构

      • image-20200531192301766
  • token包含了一些基本的信息体还有签名(消息摘要)和签名算法, 这样服务器只要用相同的签名算法去算消息体的消息签名, 如果是一样的话, 那就是说消息体没有被篡改过.

  • 所以消息体中的消息一定要保证组合的最终一致性, 比如说带上用户id, 但是一定不能带上用户密码. 因为这个消息体是传输过程中任意可见的.



有关https的一些理解

两个端口

  • 443

    • 服务器进行接受一些加密密钥, 加密规则, 连接规则的端口
  • 80

    • 服务器进行接受数据的端口

浏览器发送请求到服务器的过程

  • 3次握手
    • 1 浏览器发送连接请求, 2 服务端发送同意连接请求, 3 浏览器发送接受到服务端发送的同意连接请求. 3次握手完成后, 浏览器和服务器中都会开辟socket, 所以说socket是套接字(套就是成对的意思)
    • socket套接字的解释
      • 我们浏览器每次想服务端发送一个请求, 浏览器都会使用一个端口, 而服务器只会使用一个端口. 套接字格式类似浏览器ip: port - 服务器ip:port
      • image-20201107000500025
    • image-20201107000120843
  • 4次分手
    • 1 浏览器发送分手请求, 2 服务器接收到请求, 发送已接收回应, 3 服务器发送已同意回应, 4 浏览器发送已同意回应
    • image-20201107000521932

SSO

image-20210113004117517

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BinBin_Bang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值