본문 바로가기

어느 한 분야를 전문적으로 연구함. 또는 그 분야./정보를 여러가지 위협으로부터 보호

HKWT-2012-0015 / ClassLoader 2 : Java Application Server ClassLoader

1. Java Application Server ClassLoader

자바 취약점 분석을 위해서는 Web Application Server의 위계구조까지 확장해서 알아둘 필요성이 있는 것 같다.

Web Application Server의 위계구조를 그려보면 다음과 같다.

- Bootstrap ClassLoader - (=Primordial ClassLoader, 부트스트랩 클래스로더)

모든 ClassLoad의 부모 ClassLoader이다. JVM이 실행될 때 맨 처음 실행되는 Class Loader로, 이 ClassLoader를 사용해서 JAVA실행에 필요한 기본적인 JDK 클래스들(/jre/lib/jt.jar, i18n.jar와 같은 기본적인 Archieve, -Xbootclasspath)를 로드하게 된다. 

- Extensions ClassLoader - (=Standard Extensions ClassLoader, 확장자 클래스 로더)

Bootstrap ClassLoader를 상속하며, /jre/lib/ext(=java.ext.dirs) 디렉토리에 있는 클래스들을 로드하게 된다. 여기서 로딩되는 클래스들은 별도로 classpath에 잡혀 있지 않아도 로딩 할 수 있다.

- System ClassLoader - (=System-ClassPath ClassLoader, Application ClassLaoder, CLASSPATH 클래스로더)

Extentions ClassLoader를 상속하며, classpath에 잡혀 있는 모든 클래스 즉, java.class.path 시스템의 소유, -cp 혹은 -classpath에 잡혀 있는 모든 클래스를 로드하게 된다. 보통은 환경 변수 CLASSPATH 상의 클래스를 찾고 로드한다.

- Common ClassLoader -

별도의 classpath 설정을 필요로 하지 않으며 기본적으로 domain-dir/lib/classes와 domain-dir/lib에 있는 JAR나 ZIP파일들을 대상으로 로딩한다. 그러나 이 디렉토리들은 필수적인 것이 아니기 때문에 만약 디렉토리가 없다면 이 클래스로더는 생성되지 않는다.

- Connector ClassLoader -

모든 application에 공유가 가능하여 딱 한개만 존재한다. 이는 개별적으로 디플로이된 connector 모듈들을 로딩한다. LifeCycleModule ClassLoader와 EJB ClassLoader의 상위(부모, Parent) 클래스로더 이다.

- LifeCycleModule ClassLoader -

모든 lifecycle module들의 상위(부모, Parent) 클래스 로더이다. 각 lifecycle module들의 classpath는 각각 클래스로더가 구성한 경로를 사용한다.

- EJB(Enterprise Java Bean) ClassLoader - 

EJB 모듈이나 J2EE 모듈내에서 EJB 클래스들을 로딩한다.

- WEB ClassLoader - 

WEB 모듈이나 J2EE 모듈에서 servlet과 기타 클래스들을 로딩한다.

- JSP(Java Server Page) Engine ClassLoader - 

JSP 파일들에서 컴파일된 JSP파일들을 로딩한다.

EJB 클래스로더와 WEB 클래스로더 그리고 JSP Engine 클래스로더의 경우 deploy시 shared 또는 Universe 형태와 Isolation 형태로 나누어진다.

Shared 또는 Universe 형태는 상위(부모, Parent) 클래스로더에게 로딩을 요청하거나 상위(부모, Parent)가 직접 클래스를 로딩할 때 Application 내에 있는 모든 해당 상위(부모, Parent) 레벨의 클래스로더에게 클래스를 요청한다. 이 경우 상위 클래스로더가 reload 될 경우 연관있는 모든 하위 클래스로더가 재생성 된다.

Isolation 형태는 각 Application 마다 각각 EJB-WEB-JSP의 위계구조가 형성이 된다. 그래서 한 Application의 클래스로더는 다른 Application의 클래스를 요청할 수 없기 때문에, 각각의 Application이 공통의 클래스를 사용해야 한다면 각각의 클래스를 로딩을 해야만 한다.

2. Reference

3. Check


티스토리 툴바