系统安全框架

1、系统安全框架
1.1 认证与授权
  软件应用系统设计与开发过程中,必须要考虑系统的安全问题。软件应用系统安全主要包括认证(登录)和授权(权限管理)两部分,一般称为权限管理。
  如果不借助第三方安全框架,开发者需要自己设计并实现认证和授权功能。一般的设计思路是:用户在登录页面输入用户名和密码进行登录操作,后端应用程序在收到页面传来的用户名和密码后,就去数据库中进行数据比对,来完成认证工作。登录成功后,还需要查询该用户的角色,再通过角色关联相应的权限,根据权限来判断该用户是否能进行某项操。
  如果是 Web 项目,一般将用户及对应的角色、权限等信息放到 Session 会话中保存,这样当后端应用每接收一次请求,就可以使用拦截器或过滤器进行判断,判断该会话中是否保存用户的已登录信息。如果是登录状态,则再判断是否有权限访问相应的资源。
  在以上过程中,开发者需要自行设计登录的处理、密码加密、Session 的维护、过滤器的设置、权限验证、权限的粒度划分等,开发任务比较繁琐。
  当前,有一些优秀的第三方安全框架,它们将软件系统的安全认证相关的功能抽取出来,实现用户身份认证、权限管理、加密(密码加密登录)、会话管理等功能,形成了一个通用的安全认证框架,帮助开发者解决这些通用性问题,让开发者更能专注于自身的业务逻辑。
 
1.2 常用安全框架
安全框架主要解决应用系统中的两类问题:认证和授权。
⚫ 认证就是登录,即判断该用户是否是系统中的合法用户;
⚫ 授权就是权限设计和验证,即判断该用户是否具备访问系统中某些资源的权限。
当前,Spring Security 和 Shiro 是两个优秀的 Java 安全框架:
⚫ Spring Security:Spring 家族的一员,是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案。它利用了 Spring IOC 和 AOP 功能,为应用系统提供声明式访问控制功能,减少了为企业安全控制编写大量重复代码的工作;
⚫ Shiro 是由 Apache 软件基金会出品的 Java 安全管理框架,具有简单、功能强大的特点,在 Java 安全领域中应用广泛。
 
2、身份认证方式
2.1 Session-Cookie 认证方式
  HTTP 是无状态协议,即协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,必须要重传,这样可能导致每次连接传送的数据量增大。HTTP无状态的特性严重阻碍了 Web 应用程序的实现和应用。Cookie 和 Session 就是为了支持客户端与服务器之间的有状态交互而设计的技术。
  Session-Cookie 方式是开发 Web 应用时最常用的认证方式。
(1)用户浏览器向服务器发起认证请求,将用户名和密码发送给服务器;
(2)服务器认证用户名和密码,若通过则创建一个 Session 对象,并将用户信息保存到 Session 中。Session 的信息可以是保存到服务器文件、共享外部存储、数据库等存储中,等下次请求时查询验证使用;
(3)同时,服务器会将该 Session 的唯一标识 sessionID,返回给用户浏览器,并保存在 cookie 中;
(4)用户请求其他页面时,浏览器会自动将用户的 cookie 携带上,并发起接口请求,服务端收到请求后,从 cookie 解析出 sessionID, 根据这个 sessionID 查询登录后并保存好的 session,若有则说明用户已登录,然后放行。
  该方式是 Web 开发中最常用的认证方案,几乎所有的 Web 框架都默认集成了Session-Cookie 的认证方式。
 
2.1.1 Session 和 Cookie 区别
⚫ 数据存放位置不同:Session 数据是存在服务器中的,cookie 数据存放在浏览器当中;
⚫ 安全程度不同:cookie 放在浏览器中不是很安全,session 放在服务器中,相对安全;
⚫ 性能使用程度不同:session 放在服务器上,访问增多会占用服务器的性能;
⚫ 数据存储大小不同:单个 cookie 保存的数据不能超过 4K,session 存储在服务端,根据服务器大小来定。
 
2.1.2 Session-Cookie 认证方式的缺点

 

2.2 Token 认证方式

  Token 即令牌,及确认身份的意思,服务端可以通过令牌来确认身份。和 Session相比,Token 是开发定义的,一般不存储在服务端,而且跨域处理较为方便,多台服务器之间可以共用一个 token,因此是不同系统交互、前后端分离架构中常用的认证方式。
Token 方式的认证流程如下:
(1)用户使用用户名和密码登录,将用户名和密码发送给服务器;
(2)服务器验证用户名和密码,若正确,则签发 token,返回给用户;
(3)用户收到 token 后,将其存储起来,Web 服务一般为 localStrage 或 cookie;
(4)用户请求其他资源页面时,会携带 token,一般放到 header 或参数中,发送给服务端;
(5)服务器收到后,验证 token,判断用户的正确性。
 

 

  当前,JWT(JSON Web Token)是最常用的一种 Token 认证方式,已成为 Token 认证的标准事实。
 
2.3 OAuth 方式
  OAuth(Open Authorization)是一个开放标准,允许用户授权第三方网站访问他们存储在服务端的用户信息。常见的新浪、京东等使用的第三方登录机制就是 Auth 认证方式。OAuth 更像是一种授权机制。数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据。系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使用。
  在单纯的前后端分离系统中,OAuth 并不是常用的方式,它更多的应用在不同系统之间的授权交互。
 
3、JWT 认证方式
  JWT(JSON Web Token)方式将 Token 分段,使其可以保持少量数据,还增加了签名验证,确保了 token 的安全性。
 
3.1 JWT 的认证流程:
服务器生成一个 JSON 对象,发回给用户;
浏览器与服务器通信时,都要发回这个 JSON 对象,服务器依据这个对象来认定用户身份;
为了防止用户篡改数据,服务器在生成这个对象时,会加上签名。
 
3.2 JWT 的构成

 

 

 

 

 

 

 

 

 

 

posted @ 2023-04-02 18:13  Linqylin  阅读(132)  评论(0编辑  收藏  举报