发表于: 2020-01-06 13:30:51
2 1094
啥也不说就是干!!!
今天完成的事情:
深度思考部分的总结
1.JWT简单介绍
JWT (JSON Web Tokens) 是目前最流行的跨域认证解决方案
跨域认证问题:互联网服务离不开用户认证,一般流程如下:
1)用户向服务器发送用户名和密码
2)服务器验证通过后,在当前会话(session)中保存相关数据,比如角色、登录时间等
3)服务器向用户返回一个 session_id,写入用户的 Cookie
4)用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器
5)服务器收到 session_id 后,找到之前保存的数据,然后获取到用户的身份
这种模式下存在问题是如果服务器是集群,或者是跨域的服务导向架构,就要求 session 进行数据共享,每台服务器都能够读取到 session
比如:A 网站和 B 网站是统一价公司的关联服务。现在要求,用户只要在其中一个网站上登录,再访问另一个网站就会自动登录,该怎么实现呢?
一种是 session 数据持久化,写入数据库或者其他的持久层(如 redis)。各种服务收到请求后,都向持久层请求数据。这种方案的优点是架构清晰,缺点是工程量比较大。其次是持久层一旦挂了,就会单点失败。
另一种方案就是服务器索性不保存 session 了,所有的数据都保存在客户端,每次请求都会发回给服务器。JWT 就是这种方案的一个代表
JWT 原理是,服务器认证以后,生成一个 JSON 对象,发回给用户
{
"姓名": "张三",
"角色": "管理员",
"到期时间": "2018年7月1日0点0分"
}
用户每次与服务器通信的时候,都要携带这个 JSON 对象,服务器完全靠这个对象认定用户身份。为了防止用户篡改数据,服务器生成这个对象时候会加上签名。服务器就不保存任何 session 数据了,也就是说服务器变成无状态了,从而比较容易实现扩展
JWT 数据结构
实际的 JWT 格式如下:
它是一个很长的字符串,中间用(.)分隔成三个部分。注意,JWT 内部是没有换行的,这里是为了方便展示,将它分为几行
JWT 的三个部分依次如下:
Header(头部):一个 JSON 对象,描述了 JWT 的元数据
{
"alg": "HS256",
"typ": "JWT"
}
alg属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256);typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT。
Payload(负载):也是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了 7 个官方字段供选用:
iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号
除了官方字段,还可以加入私有字段:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
注意,JWT 默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分,这个 JSON 对象也要使用 Base64URL 转化为字符串
Signature(签名):这一部分是前两部分的签名,防止数据被篡改
首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认 HMAC),按照下面的公式产生签名
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
算出签名后,把 Header,Payload Signature 三个部分拼成字符串,每个部分用 . 隔开
Header.Payload.Signature 返回给客户端,客户端收到之后可以持久化到 Cookie或者本地数据库里面。此后客户端每次请求服务器,都要携带这个 JWT。但是放在 Cookie 里面不能跨域,所以更好的做法是放在 HTTP 氢气的头信息 Authorization 字段里面
Authorization: Bearer <token>
前面提到,Header 和 Payload 串型化的算法是 Base64URL。这个算法跟 Base64 算法基本类似,但有一些小的不同。
JWT 作为一个令牌(token),有些场合可能会放到 URL(比如 api.example.com/?token=xxx)。Base64 有三个字符+、/和=,在 URL 里面有特殊含义,所以要被替换掉:=被省略、+替换成-,/替换成_ 。这就是 Base64URL 算法。
JWT 的几个特点:
1)默认不加密,但也是可以加密的。生成原始 token 后,可以用密钥再加密一次
2)不加密的时候不要存放私密数据
3)不仅可以用作认证,还可以用于交换信息。有效使用 JWT 可以降低服务器查询数据库的次数
4)最大的缺点是,由于服务器不保存 session 状态。因此无法在使用过程中废除某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑
5)JWT 本身包含了认证信息,一旦泄露任何人都可以获得该令牌的所有权限。为了减少盗用,有效期应该设置比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证,不应该使用 HTTP 明码传输,要使用 HTTPS 协议传输
2.拦截器、过滤器、监听器各有什么作用?
拦截器 Inteceptor:
主要提供了一种机制可以使开发者自定义在一个 Handler执行前后需要额外处理的代码,也可以定义情景阻止该 Handler 执行。同时也可以横向抽取 Handler 中可重用的部分
过滤器 Filter:
实现了 Javax.servlet.Filter 接口的服务端程序,主要用途是过滤字符编码,做一些业务逻辑判断,过滤器随 web 应用启动而启动,只初始化一次,只有 web 应用停止或重启才会被销毁
监听器 Listener:
实现了 javax.servlet.ServletContextListener 接口的服务器端程序,它也随 web 应用的启动而启动,只初始化一次
监听许多信息的初始化,销毁,增加,修改,删除等
分类:
1、ServletContext监听
ServletContextListener:用于对Servlet整个上下文进行监听(创建、销毁)。
ServletContextAttributeListener:对Servlet上下文属性的监听(增删改属性)。
2、Session监听
HttpSessionListener接口:对Session的整体状态的监听。
HttpSessionAttributeListener接口:对session的属性监听。
3、Request监听
ServletRequestListener:用于对Request请求进行监听(创建、销毁)。
ServletRequestAttributeListener:对Request属性的监听(增删改属性)。
3.什么叫明文,什么叫密文,为什么不允许在数据库里明文保存密码?
用明文保存密码有很大的信息安全隐患。
一般数据库里还存有用户的姓名、手机号、用户名等信息,一旦数据库发生泄漏,再加上用户的明文密码,攻击者就可以用用户名和密码去其他网站尝试登陆(因为往往用户会将多个网站的密码根据习惯设成一样的),一旦登陆成功,就会造成更严重的后果。
4.Cookie的失效时间怎么设定?最大允许存放多少字节?
默认4kb,20个cookie
5.在App中没有Cookie,怎么解决用户身份识别的问题?Token应该放在什么位置?怎么在后端设计的时候,又支持Cookie,又支持Token?
使用 Token 进行验证,Token 存持久化到硬盘或数据库中。编写不同的拦截器对来自不同客户端的请求进行不同的处理
6.什么叫加盐?加盐能解决什么问题?通常的加盐方式有哪些?
现在的MD5密码数据库的数据量已经非常庞大了,大部分常用密码都可以通过MD5摘要反向查询到密码明文。为了防止内部人员(能够接触到数据库或者数据库备份文件的人员)和外部入侵者通过MD5反查密码明文,更好地保护用户的密码和个人帐户安全(一个用户可能会在多个系统中使用同样的密码,因此涉及到用户在其他网站和系统中的数据安全),需要对MD5摘要结果掺入其他信息,称之为加盐。
7.什么叫MD5,MD5通常做什么用处,为什么MD5不可逆,用做密码加密的时候仍然可能会被解密?
之前日只有略过
8.拦截器是什么?为什么要配置拦截器?拦截器里通常应该校验什么,怎么做到统一配置拦截器,让必须登录才能使用的接口,判断用户未登录时,返回错误信息?
之前日只有略过
9.Https是什么?怎么配置Https证书,哪些请求需要Https,登录是否需要Https?
HTTPS并不是一个单独的应用层协议,而只是Http使用SSL通道进行数据传输的过程。那么对于Https, 只需要了解Http(参考HTTP详解)和SSL协议即可。而所谓的HTTPS报文也就是SSL报文
Https = Http + SSL
配置 Https
1)Nginx 安装 ssl 模块
Nginx 默认安装的情况下ssl模块并未被安装,如果要使用该模块则需要在编译 nginx 时指定 –with-http_ssl_module 参数.
安装后
server {
listen 443 ssl;
server_name www.****.com;#域名
ssl_certificate /root/project/ssl/nginx.crt;#证书路径
ssl_certificate_key /root/project/ssl/nginx.key;#key路径
ssl_session_cache shared:SSL:1m; #s储存SSL会话的缓存类型和大小
ssl_session_timeout 5m; #会话过期时间
#...
}
启用 https,将http访问自动跳转到https
server{
listen 80 www.****.com;
rewrite ^/(.*)$ https://www.****.com/$1 permanent;
}
10.什么是对称加密,什么是非对称加密?分别适用于什么场景?
之前日志有,略过
11.Token的构造规则是什么,怎么确认用户身份的,怎么保证Token被偷窃的问题?
2.可以将用户设备的MAC地址加密后作为Token,对比请求设备的MAC号来验证
12.Cookie是在Http的什么位置存放,Cookie里的键可以重复吗?
Cookie 存放在 Http Header 中,键不可以重复
13.什么是session?什么是cookie?session和cookie有什么区别?什么场景适用于session?什么场景适用于cookie?
之前日志有,略过
明天计划的事情:
开始任务 6
遇到的问题:
暂无
评论