上次在《JSON Web Token – 在Web应用间安详地通报信息》中我提到了JSON Web Token可以用来设计单点登录系统。我实验用八幅漫画先让各人领略如何设计正常的用户认证系统,然后再延伸到单点登录系统。
假如还没有阅读《JSON Web Token – 在Web应用间安详地通报信息》,我强烈发起你花十分钟阅读它,软件开发,领略JWT的生成进程和道理。
用户认证八步走
所谓用户认证(Authentication),就是让用户登录,而且在接下来的一段时间内让用户会见网站时可以利用其账户,而不需要再次登录的机制。
小常识:可别把用户认证和用户授权(Authorization)搞混了。用户授权指的是划定并答允用户利用本身的权限,譬喻宣布帖子、打点站点等。
首先,处事器应用(下面简称“应用”)让用户通过Web表单将本身的用户名和暗码发送随处事器的接口。这一进程一般是一个HTTP POST请求。发起的方法是通过SSL加密的传输(https协议),从而制止敏感信息被嗅探。
接下来,应用和数据库查对用户名和暗码。
查对用户名和暗码乐成后,应用将用户的id(图中的user_id)作为JWT Payload的一个属性,将其与头部别离举办Base64编码拼接后签名,形成一个JWT。这里的JWT就是一个形同lll.zzz.xxx的字符串。
应用将JWT字符串作为该请求Cookie的一部门返回给用户。留意,在这里必需利用HttpOnly属性来防备Cookie被JavaScript读取,从而制止跨站剧本进攻(XSS进攻)。
在Cookie失效可能被删除前,用户每次会见应用,软件开发,应用城市接管到含有jwt的Cookie。从而应用就可以将JWT从请求中提取出来。
应用通过一系列任务查抄JWT的有效性。譬喻,查抄签名是否正确;查抄Token是否逾期;查抄Token的吸收方是否是本身(可选)。
应用在确认JWT有效之后,JWT举办Base64解码(大概在上一步中已经完成),然后在Payload中读取用户的id值,也就是user_id属性。这里用户的id为1025。
应用从数据库取到id为1025的用户的信息,加载到内存中,举办ORM之类的一系列底层逻辑初始化。
应用按照用户请求举办响应。
和Session方法存储id的差别
Session方法存储用户id的最大弊病在于要占用大量处事器内存,对付较大型应用而言大概还要生存很多的状态。一般而言,大型应用还需要借助一些KV数据库和一系列缓存机制来实现Session的存储。
而JWT方法将用户状态分手到了客户端中,可以明明减轻处事端的内存压力。除了用户id之外,还可以存储其他的和用户相关的信息,譬喻该用户是否是打点员、用户地址的分桶(见[《你所应该知道的A/B测试基本》一文](/2015/08/27/introduction-to-ab-testing/)等。
虽说JWT方法让处事器有一些计较压力(譬喻加密、编码息争码),可是这些压力对比磁盘I/O而言或者是旗鼓相当。详细是否回收,需要在差异场景下用数据措辞。
单点登录
Session方法来存储用户id,一开始用户的Session只会存储在一台处事器上。对付有多个子域名的站点,每个子域名至少会对应一台差异的处事器,譬喻:
所以假如要实此刻login.taobao.com登录后,在其他的子域名下依然可以取到Session,这要求我们在多台处事器上同步Session。