关于session和cookie的概念在社区已经有很多文章阐述了,有很多写得很好,也有很多写得很模糊的地方。
session在面试题中也是常客,在应付面试的时候我搜了一些相关文章尝试理解。但是效果却不是很好。
纸上得来终觉浅,绝知此事要躬行。
最近从0手撕服务端的时候开始接触session的实践。
本着丰富社区,尽量提供高质量的原则,我想分享一下我在实践session过程中对session的理解。
希望小白看到这篇文章能够不产生误解,不误人子弟就是好事了。
关于session、cookie产生的背景和作用我就不概述了。这里着重讲一下我对session整个过程的理解。
从第一步开始:
客户端先发起请求到服务器,当我第一次调用登陆接口时,服务器针对这次请求产生一个session。
session本质是一个对象。
目前的session对象会有一个唯一的sessionId属性,和过期时间。
当用户名、密码校验通过时,session会将用户id等信息存入session对象,最终保存到服务器中。
然后在返回http请求时,将浏览器对应网址和端口cookie添加一个 假设key是‘X-Session-Id’,value为编码过后的sessionId。可以在开发者工具里面的Application里面看到,如下图所示:
![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/605b4b04bfe0472a8922265f60de871d~tplv-k3u1fbpfcp-watermark.image)
假设服务器存储session为mysql,所存的数据结构大概如下:
![image.png](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6930812c1af94d838ff2d588ad0040c8~tplv-k3u1fbpfcp-watermark.image)
综上所述。现在我们已经完成了一次登陆操作,且创建了一个session保存到服务器。并且设置好了浏览器的cookie。下次浏览器发送请求的时候,会将cookie的信息放入请求头中。 服务器收到带有cookie的请求头之后解析cookie,可以得到sessionId。
此时对比sessionId是否记录在数据库中,如果不存在则报错。
如果存在,则将根据数据库存储的sessionId对应的userId来识别该请求是哪个用户发送的。
以上就是session鉴权的全过程。
这里挑出几个我觉得介绍得比较好的文章:
这篇文章讲得很好理解:
[彻底理解session、cookie、token](https://zhuanlan.zhihu.com/p/63061864)
这篇文章讲得比较细:
[session、cookie机制详解](https://blog.csdn.net/fangaoxin/article/details/6952954)