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

    • 流程图

    • 表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, 会根据用户名和密码再次生成签名, 如果签名和第一次的一致, 这说明这个用户名和密码没有被篡改, 验证通过.
    • 流程图

    • token的结构

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

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



有关https的一些理解

两个端口

  • 443

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

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

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

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

SSO

cookie, session, token的区别_第2张图片

你可能感兴趣的:(java基础,计算机网络,servlet,java,面试)