发表于: 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的失效时间怎么设定?最大允许存放多少字节?

setMaxAge()

默认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被偷窃的问题?

把用户信息保存在token中,jwt的那一串。再将token存到cookie中。工具类还有个验证token的函数,如果返回true则用户密码正确,登陆成功
偷窃问题
1.可以将SessionId加密后作为Token,通过对比链接的SessionId来验证

2.可以将用户设备的MAC地址加密后作为Token,对比请求设备的MAC号来验证


12.Cookie是在Http的什么位置存放,Cookie里的键可以重复吗? 

Cookie 存放在 Http Header 中,键不可以重复


13.什么是session?什么是cookie?session和cookie有什么区别?什么场景适用于session?什么场景适用于cookie?

之前日志有,略过

明天计划的事情:

开始任务 6


遇到的问题:

暂无



返回列表 返回列表
评论

    分享到