沙箱是一个限制程序运行的环境
沙箱机制就是将Java代码限定在JVM特定的运行范围中,并严格限制代码对本地系统资源的访问,以此来保证对代码的有效隔离、防止对本地系统造成破坏。不同级别的沙箱对本地系统资源的访问限制不同(CPU、内存、文件系统、网络)
1.字节码校验器
确保字节码文件(.class文件)遵守Java语言规范,实现Java程序的内存保护
注:并非所有的字节码文件都会经过字节码校验,例如核心类的字节码文件
2.类加载器
类加载器的机制是双亲委派机制
3.存取控制器
控制核心API对操作系统的存取权限(控制策略可由用户设定)
4.安全管理器
核心API和操作系统间的主要接口,实现权限控制,优先级高于存取控制器
5.安全API
Java提供的安全API
代码分为本地代码和远程代码,本地代码默认可信任,远程代码默认不可信任。受信的本地代码可以访问一切本地资源,非受信的远程代码在早期的Java实现中,安全依赖于沙箱(Sandbox) 机制
但严格的安全机制给程序的功能扩展带来了阻碍

针对安全机制进行改进,添加了安全策略,可设定代码对本地资源的访问权限

再次改进了安全机制,添加了代码签名。不论本地代码与远程代码,均依安全策略,通过类加载器将类加载到JVM中不同权限的命名空间,实现权限控制

引入了域 (Domain) 的概念
类加载器将所有代码加载到不同的系统域和应用域(统称受保护域)。系统域负责与关键资源进行交互;应用域通过系统域的代理,对需要的资源进行访问。JVM中不同的受保护域 (Protected Domain),对应不同的权限 (Permission)。存在于不同域中的类拥有当前域的所有权限
