由于HTTP是无状态的协议,之前已经认证成功的用户状态无法在协议层面上保存下来,因此下一次用户就无法继续访问,也无法和其他用户区别开。我们用cookie来管理session来弥补该缺陷。
session表示会话,实质就是后端有别于数据库的临时存储数据技术(内存--- 后同步到文件、数据库、memcache等)。session一般和cookie配合使用,大体流程如下:
1:客户端发送登录信息(用户名id、密码)
2:服务端记录认证状态,并向用户发送包含sessionID的cookie(set-cookie:PHPSESSID=....)
3:客户点可以通过发送包含sessionId的cookie,服务端直接根据sessionId来判定是否是合法用户
补充要点:
1:sessionId非常重要,应使用难以推测的字符串并且在服务端进行严格的有效期管理
2:为了减轻XSS的危害,事先应在cookie内加上httponly属性
3:一般session需要配合cookie来使用,若禁用了cookie,那就只能使用URL重写技术来完成session的功能(URL后附加上:sid=....)
4:cookie存储在客户端、session存储在服务端
引申1:cookie、localStorage和sessionStorage的区别?
相同点:都存储在客户端
不同点:
1:cookie数据大小不超过4K,而localStorage和sessionStorage可达5M或更大
2:localStorage和sessionStorage仅在本地保存,cookie会发送给服务器
3:cookie在有效时间内有效;localStorage除非主动删除否则数据不丢失;sessionStorage在浏览器窗口关闭后自动删除
引申2:cookie的操作?
1:cookie以键值对的形式保存(key=value),中间用;隔开
2:获取cookie方法:document.cookie
3:cookie新增(不是覆盖):document.cookie="newKey="+newValue;
再次刷新页面:
4:获取指定key的value
function getCookie(keyName){//获取指定名称的cookie的值
var arrStr = document.cookie.split("; ");
for(var i = 0;i < arrStr.length;i ++){
var temp = arrStr[i].split("=");
if(temp[0] == keyName)
//反转译
return unescape(temp[1]);
}
}
5:cookie新增及设置有效时间
function addCookie(keyName,valueName,hours){//添加cookie
var str = keyName+ "=" + escape(valueName);
//为0时不设定过期时间,浏览器关闭时cookie自动消失
if(hours> 0){
var date = new Date();
var ms =24*60*60*1000; //自己设置cookie时间
date.setTime(date.getTime() + ms); //注意为毫秒值
str += "; expires=" + date.toGMTString();
}
document.cookie = str;
}
引申3:token验证?
token验证流程:
1:客户端使用用户名和密码进行登录
2:服务端收到后对用户名和密码进行验证,若验证合法会生成一个token并将其返回给客户端
3:客户端将token存储在cookie、localStorage或sessionStorage中
4:之后每一次客户端每次向服务端请求资源都需要带着服务端签发的token
5:服务端根据token进行验证,不合法返回401