目前主流Web开发有两种模式,服务端渲染和前后端分离
服务端渲染
服务器发送给客户端的HTML页面,是在服务器通过字符串拼接,动态生成的。客户端拿到数据可以直接渲染显示。
优点
前端耗时少。服务器负责生成HTMl内容,浏览器只需渲染即可。有利于SEO。服务端响应的是完整HTMl页面,爬虫可以更容易的获取信息,利于SEO。
缺点
占用服务器资源。服务器完成HTML页面内容的拼接,如果请求较多,对服务器会造成一定的压力。开发效率低。后端一把梭,不能与前端分工合作,对于复杂项目,开发效率更差。
前后端分离
前后端分离的开发模式,依赖于Ajax技术的广泛应用。后端负责提供接口API,前端使用Ajax调用接口获取数据,由前端去完成页面内容的处理渲染。
优点
开发友好。前端专注UI交互,服务端专注API。前端还有很多优秀的框架,提高开发效率。用户体验好。通过前端路由的配置,我们可以实现页面的按需加载,在页面交互及用户体验上有所提升。减轻服务器压力。页面内容由前端去处理展示,后端只需提供数据。
缺点
不利于SEO。服务器一般仅响应包含根节点的HTML页面,实际内容由前端请求数据来填充。爬虫不会主动发请求获取页面内容,因此不利于SEO。
cookie、session、token
HTTP是无状态协议,服务器不能区分两个请求是否是同一用户发出的。很多业务场景要求识别用户,服务器就需要有一套机制来认证。使用cookie、session、token来实现认证机制。
具体的可以查看cookie、session、token区别
两种Web开发模式,有不同的身份认证方案:
- 服务端渲染推荐使用
Session认证机制 - 前后端分离推荐使用
JWT认证机制
Session认证机制
- 客户端第一次请求服务器时,服务器通过
响应头的形式,向客户端发送一个身份认证的Cookie,客户端会自动保存在浏览器中。 - 客户端再次请求服务器时,浏览器会自动将身份认证相关的Cookie,通过
请求头的形式发送给服务端,服务器即可认证客户端的身份
但是Cookie不具备安全性,它存储在浏览器,有API可以操作,容易被伪造。所以服务器需要验证Cookie,验证的方法就是通过Session。
session 由服务端创建,当一个请求发送到服务端时,服务器会检索该请求里面有没有包含 sessionId 标识,如果包含了 sessionId,则代表服务端已经和客户端创建过 session,然后就通过这个 sessionId 去查找真正的 session,如果没找到,则为客户端创建一个新的 session,并生成一个新的 sessionId 与 session 对应,然后在响应的时候将 sessionId 给客户端,通常是存储在 cookie 中。如果在请求中找到了真正的 session,验证通过,正常处理该请求
简单来说,就是客户端与服务端连接时,服务端都会创建一个session并生成一个唯一标识sessionId,通过Set-Cookie响应给客户端,客户端拿到sessionId后存储到Cookie。
sequenceDiagram
participant C as 浏览器
participant S as 服务器
C->>+S: 登陆请求
S-->>-C: 响应头 set-cookie ,发送给浏览器
C->>C: 保存 Cookie
C->>+S: 发起其他请求,通过请求头发送 Cookie
S->>S: 拿到 Cookie 验证
S-->>-C: 响应请求
JWT认证
Session认证机制需要配合Cookie才能实现,Cookie默认不支持跨域。当涉及前端跨域请求后端接口时,需要做很多额外的配置,才能实现跨域Session认证。
JWT是目前最流行的跨域认证解决方案。服务器加密用户信息后生成
Token字符串,并响应给客户端,客户端保存到localStorage/SessionStorage中。在之后的请求中,通过请求头Authorization发送Token给服务端,服务端解密Token可以知道用户信息,完成身份验证。
JWT由三部分组成,分别是Header(头部)、Payload(有效载荷)、Signature(签名),其中Payload是真正的用户信息,是经过加密后产生的字符串,Header、Signature是安全性相关的部分,只是为了保证Token的安全性。三者之间通过英文的.号分隔,格式Header.Payload.Signature
sequenceDiagram
participant C as 浏览器
participant S as 服务器
C->>+S: 登陆请求
S->>S: 将用户信息加密,生成Token字符串
S-->>-C: 将生成的 Token 发送给客户端
C->>C: 保存 Token 至 SessionStorage/LocalStorage
C->>+S: 发起其他请求,通过请求头 Authorization 发送 Token 给服务端
S->>S: 服务器还原 Token 字符串,获取用户信息,认证用户身份
S-->>-C: 认证成功后,响应请求