关于HTTP cookie,sessionid,token问题

1.cookie不安全,而sessionid也是放在cookie里,是不是没有区别,不安全?

答:首先cookie是放在HTTP头部字段的东西,里面存放的是身份标识数据。由于cookie是明文显示的,如果身份标识数据是用户密码,那肯定不安全。存放在客户端,容易被篡改。

而sessionid也是身份标识数据,但是是放在服务端的,就是一个单纯的id,就算被知道了,也不知道用户密码。所有sessionid是存在在cookie里的。

安不安全取决于身份标识数据存放的是什么。而争对cookie安全问题,JS脚本可以用document.cookie来读写cookie,有可能导致XSS(跨站脚本)攻击,防止方法:

(1)属性HTTPonly,告诉浏览器,只能通过浏览器HTTP协议传输。JS引擎就能禁用document。cookie等一切相关API,就没有脚本攻击了。

(2)属性sameSite,防范“跨站请求伪造”,可以设置cookie不随着跳转链接跨站发送。

(3)secure,表示cookie只能使用HTTPS加密传输,但cookie本身不加密还是明文。

2.token和sessionid有什么区别?

答:session是存放在服务端的。如果服务器做了负载均衡,请求定向到其他服务器节点,那台服务器没有用户session信息,就不能验证。所有session是不适合作分布式部署的。而且服务器重启,没有持久化存储的话,session数据会丢失。

而token是存放在客户端的,时间换空间,是无状态的,所以在分布式应用广泛。token是令牌,访问API接口所需的资源凭证。token使服务器无状态,不存储会话信息。

session是记录客户端和服务器会话状态的机制,服务器有状态,可以记录会话信息。token有签名还能防止监听和重发攻击,所以比session安全。

session认证是由于sessionid的不可预测性,安全的。而token,类似于OAuth token提供了认证(用户)和授权(APP),目的是让某APP有权访问用户信息。如上所说,如果你需要实现有状态的会话,仍然可以增加session来在服务器端保存一些状态

总之,如果你的用户数据需要和第三方共享,或者第三方(除了你和服务器)调用API接口,就用token。如果是自己的网站,都可以。

App通常用restful api跟server打交道。Rest是stateless的,也就是app不需要像browser那样用cookie来保存session,因此用session token来标示自己就够了,session/state由api server的逻辑处理。 如果你的后端不是stateless的rest api, 那么你可能需要在app里保存session.可以在app里嵌入webkit,用一个隐藏的browser来管理cookie session.

3.只要关闭浏览器,sessonid就消失?

4.cookie是保存在本地终端的数据。cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的。

用户登录时产生cookie:

document.cookie = "id="+result.data['id']+"; path=/";

document.cookie = "name="+result.data['name']+"; path=/";

document.cookie = "avatar="+result.data['avatar']+"; path=/";

token的意思是“令牌”,是用户身份的验证方式,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。还可以把不变的参数也放进token,避免多次查库

5.cookie 和session的区别

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
   考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
   考虑到减轻服务器性能方面,应当使用COOKIE。

4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

5、所以个人建议:
   将登陆信息等重要信息存放为SESSION
   其他信息如果需要保留,可以放在COOKIE中

当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。

保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。
经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。还有一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。

这个token 我不保存, 当小F把这个token 给我发过来的时候,我再用同样的HMAC-SHA256 算法和同样的密钥,对数据再计算一次签名, 和token 中的签名做个比较, 如果相同, 我就知道小F已经登录过了,并且可以直接取到小F的user id , 如果不相同, 数据部分肯定被人篡改过, 我就告诉发送者:对不起,没有认证。

这样一来, 我就不保存session id 了, 我只是生成token , 然后验证token , 我用我的CPU计算时间获取了我的session 存储空间 !

解除了session id这个负担, 可以说是无事一身轻, 我的机器集群现在可以轻松地做水平扩展, 用户访问量增大, 直接加机器就行。这种无状态的感觉实在是太好了!

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值