持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情
什么是登录认证
- 我们知道HTTP协议是无状态的,指的就是客户端的每次请求对于服务端来说都是一样,不会区别对待。
- 这样设计的好处是,服务端的设计相对简单,不需要处理请求和请求之间的关系,并且效率高。
- 但是缺点在于,这样的模式无法满足目前互联网的通用需求:比如电商网站,需要登录登录后才能下单和结算。
- 简言之,就是说要通过某种技术,让服务端知道这个请求是哪个用户的请求,即登录认证。
- 一般来说有三种常用的技术,分别是:Cookie、session和jwt
使用Cookie和Session
- 为了实现登录认证,最早出现的技术Cookie,Cookie的实现原理和实现手段都比较简单。
- 即用户在登录完成后,服务端会将用户的特征信息,比如邮箱或用户名或用户id等信息放放在响应头中的cookie中返回给客户端
- 客户端收到cookie后存在客户端本地,以后客户端再次访问服务端的其他页面或接口时,在请求头中带上这个cookie
- 这样服务端在收到新的请求时,提取请求头中的cookie信息,知道这个请求是哪个用户的请求。
- 这样的设计简单且容易理解,并且实现简单,但是缺点是不安全。保存在客户端的特征信息很容易被盗取,且盗取后服务端区分。
- cookie技术的关键点用户的特征信息存在客户端上,这是不安全的。于是出现了session,它的的解决方案是把用户特征信息存在服务端。
- session的具体原理:用户登录后,将用户的特征信息和特征信息哈希得到的字符串保存在数据库中,然后把字符串返回给客户端当cookie
- 客户端以后再请求服务端时带着这个字符串,服务端收到请求时,解析得到随机字符串,然后在数据库中找这个字符串对应哪个用户,这样服务端就知道了是哪个用户发起的本次请求。
- session通过将用户信息存在服务端,客户端只拿到一个加密后的字符串,这样降低了用户用户信息被盗取的风险。并且session中哈希得到的字符串中有失效时间的因素,这样大大降低了用户信息被盗取的风险。
- 但是,session也有缺点:首先,session不是完全安全的,在一定时间内用户的session被别人盗取后,还是有冒充用户的风险。其次,服务器保存用户的session,在用户量剧增后将难以维护。
- 于是后来又出现了jwt,即json web token的方式来解决这个问题。
jtw
- 首先要说明的是 jwt和session一样都依赖cookie,但是不同的是,使用jwt是服务端不会存在用户特征信息,而是将特征信息存在客户顿。
- 原理:用户登录后,将用户的特征信息保存在一个字字典中,并且加上过期时间的键值对。然后将这个信息加密,得到一个jwttoken
- 然后将这个jwttoken当做cookie放在客户端,客户端以后再发请求时携带这个jwttoken
- 服务端收到请求后,反解jwttoken,得到用户的基本信息,最后知道这次请求是那个用户的操作。
- jwttoken使用加密和解密的方式,可以在很大程度上防止用户信息被盗取,并且不会在服务端存放大量用的信息。