现在很多node.js项目都使用express来做的,不得不承认这个框架很火热。很多需求只需要安装插件简单配置就可以快速应用到项目中。有个问题:
如果不依赖框架,不使用第三方模块,设计一个登陆,如何使用session和cookie,原理是什么?
现在很多node.js项目都使用express来做的,不得不承认这个框架很火热。很多需求只需要安装插件简单配置就可以快速应用到项目中。有个问题:
如果不依赖框架,不使用第三方模块,设计一个登陆,如何使用session和cookie,原理是什么?
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
4 回答2.4k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
本来想详细讲解一下的,想想还是算了,简单列一下登录认证过程中,就应该能理解了
客户端: 我要查看用户资料
服务端: 你没有凭证(cookie),请先获得凭证再来,获得凭证需要你提供用户名密码。
客户端: 好的,这是我的用户名和密码
服务端: 验证通过,现在为你生成凭证,请保管好,以后只认凭证,就算阿猫阿狗拿着你的凭证来查资料,我也会给他。
。。。
客户端:我要查用户资料,这是我的凭证.
服务端:好的,请稍等,我确认一下你的凭证是否真的,OK,是真的,资料拿去。
。。。
客户端:我要查用户资料,这是我的凭证.
服务端:对不起,你的凭证已经过期失效了,请重新提供用户名密码获得新的凭证。
OK,再来讲一下怎么生成凭证和怎么验证凭证:
生成的条件是验证用户提供的用户名和密码是对的,
a. 生成随机唯一的session_id, 比如md5(用户id+毫秒数)
b. 生成session内容,并建立session_id与session内容的对应关系
即服务端拿一本帐本,记录下这个凭证(根椐标识)对应的用户名(一般是用户ID)是谁,类似:
abcd123 => 'Tim',
ee22343 => 'You'
(这个对应关系,可以保存在文件、memcache、数据库等等,这就是用不同介质保存session的原理)
c. 将session_id加密、签名,写到凭证中,返回客户端。
用通俗语言来描述这个过程就是:
验证用户名密码正确后
服务端拿出一张纸,随机写上一个标识(比如像医生写病历,有一定的防伪性) ---- session_id
再拿出帐本,写上这个“标识”与“用户”的关联,表示这个标识就等同于用户A ----session_id与session内容关联
给这张纸盖上大印 ----session_id加密和防伪
将这张纸作为凭证,交给用户 ---- 将加密后的session_id作为cookie返回。
最后,用户下次来请求,带上了凭证,服务端验证过程:
其它:
凭证有效期:比如可以约定,一天后就没有用了
帐本有效期:session也是可以有效期的,比如我每隔一小时就删除一些没有用到的session,清理之后,就算你的凭证是真实的,但也无效了。
最后,cookie是标准实现,无所谓自己实现(你可能只是需要封装操作指令),要自己实现session的话,无非就是解决这几个问题:
1)决定你的帐本(用什么方式保存)
2) 实现写帐本(根据session_id写数据)
3) 实现读帐本(按session_id读数据)
4) 实现清理帐本过期数据