【Java Web/计算机网络】Session vs. Cookie vs. Token

【Java Web/计算机网络】Session vs. Cookie vs. Token

一、什么是Cookie?

Cookie 是保存在用户计算机上的小型文本文件。cookie 的最大文件大小为 4KB。它也称为 HTTP cookie、Web cookie 或 Internet cookie。当用户第一次访问网站时,网站会以 cookie 的形式向用户的计算机发送数据包。

Cookie 帮助网站在用户访问其网站时跟踪用户的浏览历史或购物车信息。

存储在 cookie 中的信息不安全,因为它以任何人都可以看到的文本格式保存在客户端。我们可以根据需要激活或禁用 cookie。

Why Cookie

HTTP 是一种无状态协议,因此它不存储任何用户信息。所以,我们可以使用 Cookie,它允许我们将信息存储在用户的计算机上并跟踪应用程序的状态。

二、什么是Session?

Session用于将信息暂时保存在服务器上,以便可以在网站的各个页面上使用。用户Session在用户登录到特定的网络应用程序时开始,并在用户退出程序或关闭机器时结束。

Session值更加安全,因为它们以二进制或加密形式保存,并且只能在服务器上解码。当用户关闭机器或退出程序时,Session值会被自动删除。我们必须将值保存在数据库中以永久保存它们。

  • session 是另一种记录服务器和客户端Session状态的机制
  • session 是基于 cookie 实现的,session 存储在服务器端,sessionId 会被存储到客户端的cookie 中

Working of Session

image-20220302201640104

  1. 第一步,客户端通过 GET 或 POST 方法向服务器请求。
  2. sessionID在服务器上创建,并将 sessionID 保存到数据库中。它返回带有 cookie 的 sessionId 作为对客户端的响应。
  3. 存储在浏览器上的带有 sessionID 的 Cookie 被发送回服务器。服务器将此 id 与保存的 sessionID 匹配并发送响应HTTP200

Session如何判断是否为同一对话

服务器第一次接收到请求时,开辟了一块 Session 空间(创建了Session对象),同时生成一个 sessionId ,并通过响应头的 **Set-Cookie:JSESSIONID=XXXXXXX **命令,向客户端发送要求设置 Cookie 的响应; 客户端收到响应后,在本机客户端设置了一个 **JSESSIONID=XXXXXXX **的 Cookie 信息,该 Cookie 的过期时间为浏览器会话结束;

Session的缺点

Session 机制有个缺点,比如 A 服务器存储了 Session,就是做了负载均衡后,假如一段时间内 A 的访问量激增,会转发到 B 进行访问,但是 B 服务器并没有存储 A 的 Session,会导致 Session 的失效。

三、Session和Cookie的区别

CookieSession
Cookie是本地计算机上保存用户信息的客户端文件。Session是包含用户数据的服务器端文件。
Cookie在用户设置的生命周期内结束。当用户退出浏览器或退出程序时,Session结束。
它只能存储一定数量的信息。它可以保存无限量的数据。
浏览器cookie的最大容量是4KB。我们可以在绘画中保留尽可能多的数据,但是脚本一次可使用的最大内存限制为128MB。
因为cookie保存在本地计算机上,所以我们不需要运行函数来启动它们。要开始Session,我们必须使用session start()方法。

四、什么是Token(令牌)

Token, 令牌,代表执行某些操作的权利的对象
访问令牌(Access token)表示访问控制操作主体的系统对象

token是通过对用户的信息进行加密处理获得的,一般放在请求头,在下一次请求时我们可以通过对比两次的 token 是否一致来判断是否是 CSRF 的伪造请求。

由于token是在请求头的,而不是像session id存在cookie中(在cookie中的话攻击者利用你的身份发请求,网站还是只验证你本地cookie的session id是否匹配就能发起攻击),当攻击者想要利用你的身份发恶意请求时,由于他无法得知你请求头的token信息,所以无法伪造合法的请求。

基于Token的身份验证的过程如下:

image-20220302210233160

​ 1.用户通过用户名和密码发送请求。

​ 2.程序验证。

​ 3.程序返回一个签名的token 给客户端。

​ 4.客户端储存token,并且每次用于每次发送请求。

​ 5.服务端验证token并返回数据。

五、JSON Web Token和Session Cookies的区别

密码签名

JWT 具有加密签名,而 Session Cookies 则没有。

Session 和 Token 并不矛盾

作为身份认证 Token 安全性比 Session 好,因为每一个请求都有签名还能防止监听以及重放攻击,而 Session 就必须依赖链路层来保障通讯安全了。如果你需要实现有状态的会话,仍然可以增加 Session 来在服务器端保存一些状态。

验证

Token:服务端验证客户端发送过来的 Token 时,还需要查询数据库获取用户信息,然后验证 Token 是否有效。

JWT: 将 Token 和 Payload 加密后存储于客户端,服务端只需要使用密钥解密进行校验(校验也是 JWT 自己实现的)即可,不需要查询或者减少查询数据库,因为 JWT 自包含了用户信息和加密的数据。

可扩展性

Session Cookies 是存储在服务器内存中,这就意味着如果网站或者应用很大的情况下会耗费大量的资源。由于 JWT 是无状态的,在许多情况下,它们可以节省服务器资源。因此 JWT 要比 Session Cookies 具有更强的可扩展性。

JWT 支持跨域认证

Session Cookies 只能用在单个节点的域或者它的子域中有效。如果它们尝试通过第三个节点访问,就会被禁止。如果你希望自己的网站和其他站点建立安全连接时,这是一个问题。

使用 JWT 可以解决这个问题,使用 JWT 能够通过多个节点进行用户认证,也就是我们常说的跨域认证。

JWT 和 Session Cookies 的选型

对于只需要登录用户并访问存储在站点数据库中的一些信息的中小型网站来说,Session Cookies 通常就能满足。

如果你有企业级站点,应用程序或附近的站点,并且需要处理大量的请求,尤其是第三方或很多第三方(包括位于不同域的API),则 JWT 显然更适合。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problems: The method addActionListener(ActionListener) in the type AbstractButton is not applicable for the arguments (EntertainmentMode) void is an invalid type for the variable actionPerformed Syntax error on token "(", ; expected Syntax error on token ")", ; expected cy cannot be resolved cy cannot be resolved panel cannot be resolved to a variable at idiom_game.EntertainmentMode.<init>(GameMenu.java:208) at idiom_game.GameMenu.actionPerformed(GameMenu.java:137) at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1972) at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2313) at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405) at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262) at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279) at java.desktop/java.awt.Component.processMouseEvent(Component.java:6626) at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3389) at java.desktop/java.awt.Component.processEvent(Component.java:6391) at java.desktop/java.awt.Container.processEvent(Container.java:2266) at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5001) at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2324) at java.desktop/java.awt.Component.dispatchEvent(Component.java:4833) at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4948) at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4575) at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4516) at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2310) at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2780) at java.desktop/java.awt.Component.dispatchEvent(Component.java:4833) at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:722) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:716) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:97) at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:746) at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:744) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:743) at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
06-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值