起因
工作中开始接触用户模块,但是本人web基础巨烂无比,因此google了一下,结合现有业务理解了下cookie,session,token的概念。
转载:http://www.v2ex.com/t/80003 binux的回答,是我看到最简单的解释
说那么多token,session的。叫token的多了去了,这些概念都是伪的。
对于HTTP协议来说,就是url,header,body
对于WEB页面来说,就是url,form/post body,cookie
好了,现在有的就是这么多东西,要怎么用呢?
首先是第一个问题,HTTP请求是无状态的,我怎么知道谁是谁?
解:让用户每次访问的时候告诉你它叫什么,怎么告诉?url,form/post body,cookie
然后是第二个问题,用户访问的时候说他自己是张三,他骗你怎么办?
解:在服务器端保存张三的信息,给他一个id,让他下次用id访问。id保存在url,form/post body,cookie中。这叫做session
现在是第三个问题,用户提交了一笔订单,你怎么保证他是在你的订单页面提交的?(referer可能是一个办法)
解:在你订单页面中放入一个加密的信息,只有真正打开了订单页才能知道,提交的时候将这个信息返回回来。这个东西,可以被叫做token
说穿了,就是因为HTTP的无状态问题,导致了产生如此多的概念,去维护客户端与服务端的状态同步。
用户登陆中cookie,session的使用
处理方式:
- 用户登陆
- 当用户登陆时,服务端给用户一个已加密的cookie,里面记录了用户的身份信息(userId),sessionId等校验信息。同时在服务端,存储sessionId相对应的校验数据。
- 预览其他页面
- 在站内的所有页面会继承一个模块,主要功能就是做用户登陆校验用的。已php的HMVC模式举例。所有的control层都会继承一个template的模板。在这个模板中,它会去检验用户的上传的cookie,已判断用户。
- 判断的主要方式是解密用户上传的cookie,拿到sessionId,以及校验信息。通过sessionId至服务端拿到对应的校验信息。对比两部分的校验信息,判断用户的合法性,确定登陆用户。
一些常见问题:
- session存储方式
- http://www.douban.com/note/269093631/
- 上面那个链接已经很详细的介绍了现有session几种存储方式就不多介绍了
- 安全性保证
- 当cookie被别人盗用时,账号安全完全无法保证。个人在这方面暂时没有看到好的文章去回应这个问题。
token
主要用于防止CSRF攻击。
http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html
这个blog中非常好的介绍了这部分内容