
JVM에 ClassLoader 객체는 사용되어지는 class file을 Memory로 Loading하는 작업을 한다.
Applet을 실행 시키는 JVM은 classpath(Browser내에 내장된 class Library)에서 Loading한 class와 외부로 부터 downloading한 class의 Naming Space를 다르게 관리를 한다.
외부로 부터 downloading된 class, 즉 Untrusted Code는 SecurityManager객체에 의해 활동이 제한이 되어 진다.
JDK1.0 Security Model은 Sandbox Model이라고 하는데, Untrusted Code에 대해서는 Naming Space를 다르게 관리 함으로써, SecurityManager객체에 의해 활동이 제한되는 Sandbox라는 Boundary 영역내에서만 활동하는 구조를 말한다.
▶ JDK1.1 Security Model - Sandbox Model + Signed Applet
JDK1.1 Security Model은 1.0의 Sandbox Model에 Signed 개념이 추가가 되었다.
Untrusted Code가 Sign만 되면, Sandbox boundary를 벗어나 local의 classpath에서 loading된 class처럼 활동할 수 있다. SecurityManager 객체의 제한은 않받는다는 것이지요.
지금 현재의 Browser는 JDK1.1의 Security Model을 사용하고 있다.
▶ JDK1.2 Security Model - Sandbox Model + Protection Domain
JDK1.2 Security Model은 JDK1.1 Security Model(Sandbox + Signed)에 Protection Domain개념을 추가시킨 구조이다.
1.1 version에서 Signed code는 1.2 version에서 Domain으로 관리가 되고, 각 Domain별로 Sandbox boundary를 다르게 설정할 수가 있어, Sandbox boundary가 Domain별로 가변적이라는 특성을 갖게 된다.
Domain은 Signer와 Codebase에 의해 결정이 되고, client의 policy file에 각 Domain이 활동 가능한 Sandbox boundary를 설정하게끔 되어있다.
JDK1.2 version에서는 jdk1.2\jre\lib\security\ directory에 java.security file은 master security properties file을 제공하는데, 이것은 Security에 관련된 Configuration file이다. 이 file내에 Domain의 활동 영역을 설정하는 policy file을 지정할 수 있는 부분이 있다.
# The default is to have a single system-wide policy file,
# and a policy file in the user's home directory.
policy.url.1=file:${java.home}/lib/security/java.policy
policy.url.2=file:${user.home}/.java.policy
# User Policy File
policy.url.3=file:/D:/javaLab/signedApplet1.2/MyPrint.jp
java.home : jre directory
java.policy file : System policy file
.java.policy file : user default policy file(c:\windows\ 생성)
MyPrint.js file : user define policy file
java.policy file은 JDK1.2 version, JRE1.2 version을 Installation하면 ~jre/lib/security/ 자동 생성되고, .java.policy file은 c:\windows directory에 필요하다면 생성 할 수가 있다.
policy file은 editor tool로 작성가능하지만, JDK에서 제공하는 policytool로 edit하는 것이 편리하다. 일단 System policy file인 java.policy file의 내용은 아래와 같다.
// Standard extensions get all permissions by default
grant codeBase "file:${java.home}/lib/ext/-" {
permission java.security.AllPermission;
};
// default permissions granted to all domains
// 모든 domain에 대해 System properties를 read 할 수 있는 permission을 설정하고 있다.
grant {
// Allows any thread to stop itself using the java.lang.Thread.stop()
// method that takes no argument.
// Note that this permission is granted by default only to remain
// backwards compatible.
// It is strongly recommended that you either remove this permission
// from this policy file or further restrict it to code sources
// that you specify, because Thread.stop() is potentially unsafe.
// See "http://java.sun.com/notes" for more information.
permission java.lang.RuntimePermission "stopThread";
// allows anyone to listen on un-privileged ports
permission java.net.SocketPermission "localhost:1024-", "listen";
// "standard" properies that can be read by anyone
permission java.util.PropertyPermission "java.version", "read";
permission java.util.PropertyPermission "java.vendor", "read";
permission java.util.PropertyPermission "java.vendor.url", "read";
permission java.util.PropertyPermission "java.class.version", "read";
permission java.util.PropertyPermission "os.name", "read";
permission java.util.PropertyPermission "os.version", "read";
permission java.util.PropertyPermission "os.arch", "read";
permission java.util.PropertyPermission "file.separator", "read";
permission java.util.PropertyPermission "path.separator", "read";
permission java.util.PropertyPermission "line.separator", "read";
permission java.util.PropertyPermission "java.specification.version", "read";
permission java.util.PropertyPermission "java.specification.vendor", "read";
permission java.util.PropertyPermission "java.specification.name", "read";
permission java.util.PropertyPermission "java.vm.specification.version", "read";
permission java.util.PropertyPermission "java.vm.specification.vendor", "read";
permission java.util.PropertyPermission "java.vm.specification.name", "read";
permission java.util.PropertyPermission "java.vm.version", "read";
permission java.util.PropertyPermission "java.vm.vendor", "read";
permission java.util.PropertyPermission "java.vm.name", "read";
};
위의 내용은 보면, jre\lib\ext\ directory에서 loading된 class는 AllPermission을 갖는다. 즉 SecurityManager의 제한이 없다는 것을 의미한다. 그리고, 두번째 항목은 모든 Domain에 대해 System.getProperty("java.version") method를 통해 System Property를 read할 수 있는 Permission을 설정한 사항이다.
policytool을 이용해 위와 같은 내용으로 Domain별 Sandbox boundary를 설정한 file을 생성할 수가 있고, 그 file을 JVM이 loading될때 policy file로 인식하게 하기 위해 java.security file에 설정할 수가 있다.





