Cookie和Session理解

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

用超市储物箱的例子最为合适


人们去超市购物,去存包,第一个去的时候(客户第一次发送请求给服务器),超市会给你一个号码牌(此时服务器产生一个唯一的sessionID,并返回给客户端(通过cookie)),你可以在你自己的柜子里存东西(在服务器属于此客户的内存区域存数据),下次你再去的时候,拿着这个号码牌(请求request中携带cookie),超市就知道哪些东西是你的,然后给你取出来,如果你几天都没去取(session失效了,在服务器端配置),你再去的时候东西就拿不到了如果你把这个号码牌丢了(刚才的cookie失效了,比如你重启电脑,刚才存于内存中sessionID也就丢了),再去拿东西,当然无法定位了,也就拿不到东西了
如果是新打开一个浏览器的情况,那就像是又一个人去超市存东西一样,你的东西跟他的东西是两码事,互不影响,他有他自己的sessionID,你有你自己的

Cookie

Cookie和Session理解

  • 服务器生成
  • cookie存在于浏览器中,以键值对(数组)的形式存在
  • 不可跨域访问,也就是不同的浏览器或者不同的网页不会共用一个cookie

Session

  • Session保存在服务器端。为了获得更高的存取速度,服务器一般把Session放在内存里。每个用户都会有一个独立的Session。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。
  • Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。
  • 【有效期】越来越多的用户访问服务器,因此Session会越来越多,对服务器造成压力,为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。
  • 【对浏览器的要求】Session保存在服务器,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持。这是因为Session 需要使用Cookie作为识别标志。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一 个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session 依据该Cookie来识别是否为同一用户。
  • 新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。例如,在链接上右击,在弹出的快捷菜单中选择“在新窗口中打开”时,子窗口便可以访问父窗口的Session。

Cookie和Session关系

Cookie和Session理解

  • 用户访问通过浏览器访问服务器
  • 服务器生成一个SessionId和Cookie
  • 每一个session对象都有一个sessionId,而在cookie数组中,又一个元素叫做JSESSIONID,服务器将session对象的sessionId,以名称叫做JSESSIONID,值为sessionId的形式存入cookie数组中,这样cookie和session就发生了关联。
  • 然后加密传回浏览器,浏览器将cookie保存
  • 二次访问服务器后,浏览器将Cookie和访问的信息一起发到服务器
  • 服务器解析出id
  • 判断这次访问是否为之前访问的用户

参考博客:https://www.cnblogs.com/andy-zhou/p/5360107.html

问题

1.清空浏览器的时候,session会消失吗?

session是存在于服务器的,清除浏览器缓存,只是清除了cookie,跟session一点关系都没有。那么为什么我们却不能访问网站,而需要重新登录了呢?

一般的web项目会通过session来判断用户是否有登录,常用的判断语句是if(session.get(“userId”)==null。如果为空,则表示需要重新登录。这时候其实隐式地调用了getSession()方法,这就回到了上一步我们所讲的session获取的具体步骤了。因为清空了浏览器缓存,这时候cookie数组中必定不会有JSESSIONID这个cookie,所以必须得新建一个session,用新的sessionId来给JSESSIONID这个cookie赋值。由于是新建的session,session中必定没有userId这样的属性值,所以判断结果自然为空,所以需要重新登录。这次赋值以后,下一次再请求该网站的时候,由于cookie数组中已经有了JSESSIONID这个cookie,并且能通过该JSESSIONID的值找到相应的session,所以就不需要再重新登录了。

2.如何拿到sessionID

  • sessionID存在服务器的内存中,默认时效为30分钟,超过时间未请求,sessionID会被清除
  • 客户端将sessionID保存在cookie中,但是有时效

参考:https://blog.csdn.net/qq_33251859/article/details/77481868

3.如何保护自己的cookie,不让别人登录

  • ip和session绑定
  • 再加一层保护,cookie外加一层认证csrf-token,不存于cookie中,但问题是token也可能被恶意用户拿到

csrf:跨站点请求伪造(Cross Site Request Forgery)

参考: https://blog.csdn.net/stpeace/article/details/53512283