都知道http是无状态的协议,那么要记录状态的话,就应当有辅助的东西来记录状态,cookie & session 的作用就在与此啦~
cookie
what
什么是cookie?cookie其实是存储到用户本地的少量数据,一般用于用户身份信息确认。
where
那么,我们怎么看到cookie呢?
审查以下掘金的页面,可以看到掘金存储的cookie,cookie一般存于用户内存&硬盘里面。
cookie的属性
接下来,我们来看以下cookie的具体属性
name // cookie 名 必须
value // cookie 值 必须
domain // cookie 所属域名 必须
path // cookie 所属path 必须
expires // cookie 过期时间 UTC时间格式
max-age // cookie 存活时间 以s为单位,0表示删除,小于0或没有表示会话cookie(关闭浏览器即失效)
size // cookie 大小
httponly // 只允许http请求携带cookie,document.cookie不支持
secure // 只允许https请求携带cookie,http不允许
如何设置&读取
设置cookie,可以在浏览器端设置,也可以在服务器端设置。
我们先看下浏览器设置cookie,设置的时候只需对document.cookie对象进行赋值即可,设置完成之后,可在cookie中查看。
当然了,读取cookie除了在审查元素中看之外,也可以通过document.cookie来读取(除了httponly的cookie)。
接着我们看下服务器端
服务器端设置cookie也很简单,设置的时候,在响应头中设Set-Cookie字段即可,读取的时候,cookie会在请求头中携带过去给服务端。
session
说完了cookie,我们就来说以下session。
使用
session通常是web服务用来保存状态的方法,它需要于cookie一起使用。
为什么session要配合cookie使用呢?原因很简单,因为没有cookie,用户就没有携带信息过来呀。
所以,第一次访问页面的时候,session就会认为该用户是一个新的用户,于是为用户生成一个session-id : session,并且将session-id在响应头的Set-Cookie中返回,在用户端保存来session-id。
之后的所有请求,用户就都会携带session-id到服务端,服务端在请求头的cookie中拿到session-id,则可以判断用户是谁,然后就可以根据用户的身份进行相应的操作了。
当然,session也有过期时间。例如过期时间为60分钟:没有收到用户数据开始的60分钟后,session就过期了。
存储
session的存储方式有两种:内存 & 数据库
如果服务器单机的话,session存内存是完全没有问题的。
如果是分布式的话,那么session就不能存内存的,因为多台机器的session是不能互通的,所以可能会出现,有的接口有登录,有的接口没登录的状态。所以,分布式的话经常使用的数据库是redis。
写在最后
cookie与session还是比较常用的,梳理完之后希望可以更加理解。