session与token
1、session
session机制是服务器将需要在不同请求间沟通的数据保存在服务端,这块内容称为session,而仅仅将session的id返回给浏览器,浏览器下次请求时携带id,服务端在其本地进行读取解析。
比较:
- 信息存储在客户端,有危险。而session的信息存储在服务端
- cookie有大小限制,而session由于信息在服务端没有传输大小限制
- cookie低效,session因为传输数据小所以高效
- 当然,session在服务端会占用服务器的资源,数据过多也会导致问题
session id本质上依据是基于cookie进行传输的。一般,在访问网站的第一时间,服务器容器会默认的设置session,该session设为会话类型,带有httponly标志,不同容器的session的名称可能不同。
SESSIONID=mD3cHY2uPhvcrGDwnYL1gxPu7FAWTFH64dHVpkPivuV
PHPSESSID=4680c9df2ce9ac4d1aa7f366bd92d83a
2、token
cookie机制只能在同域或者子域进行携带,session属于cookie。而对于某些站点来说,可能具有多个互不兼容的域名,这时无法利用cookie作为登录凭证。
一个思路是设置cookie匹配多个域,但是这是跨域设置cookie,极有可能干扰其他站点,造成危害或者影响正常业务。
解决方法是放弃cookie,在请求时手动添加登录凭证。这个cookie之外的登录凭证称为token,实质是一段在登录成功后的验证文本。在之后的每次需要验证身份的请求时,携带该文本。
场景1:前后端不分离,服务端直接为响应中的html或者动态文件中的url添加token参数
场景2:前后端分离,前端ajax发起请求时,js将token拼接到url中,或者设置为头部字段,或者在请求体部中
需要注意,token的强度,以及不能直接在响应中直接在cookie中设置。
token除了实现跨域的登录状态验证,还可以在每次响应时重新设置token,实现防止csrf和表单重复提交功能。