2010.09.02 18:53

Tomcat Web Server SSL 설정

디지털 커머스의 증가와 중요한 데이터간의 이동이 필요함에 따라서 보안은 모든 어플리케이션에서 중요한 자리를 차자하고 있습니다. 일반적으로 client 와 서버간에 사용자를 확인하기 위한 방법으로 username 과 password 를 체크합니다. 이를 사용하는 보안 처리 기법으로 Secure Sockets Layer (SSL) 과 Java Authentication and Authorization Service (JAAS)를 사용할 수가 있습니다. 먼저 SSL로 보안인증을 거치는 방법을 보고 java 에서 지원하는 다른 사용자 인증서비스인 JAAS을 jsp와 서블릿에서 사용하는 법을 보겠습니다.


1. 톰켓에서 사용자 인증 처리하기

톰켓으로 사용자 인증처리를 하기전에 먼저 username, password, role 을 등록해야 합니다. 등록하는 방법은 아주 쉽습니다. 톰켓이 설치된 폴더에서 /conf 에 보면 tomcat-user.xml 파일이 있습니다. 없으면 에디터 창에서 새로 만들어도 됩니다. 

<?xml version='1.0' encoding='utf-8'?><?xml version='1.0' encoding='utf-8'?> 
<tomcat-users> 
    <role rolename="dbadmin"/> 
    <role rolename="manager"/> 
    <user username="hans" password="hansworld" roles="dbadmin,manager"/> 
    <user username="jojo" password="33dsk3" roles="manager"/> 
</tomcat-users> 

위 소스에서 hans는 dbadmin과 manager의 권한을 갖고 jojo는 manager의 권한을 갖습니다. 

다음으로 톰켓서버에서 SSL을 셋팅해야 합니다. 이는 username이나 password 가 http상에서 이동할 때 암호화 되어 이동하기 때문에 중간에 악의적인 의도로 가로채거나 훔쳐내는 것을 방지해 줍니다. SSL을 셋팅하기 위해선 2가지 절차를 거쳐야 합니다.

1. java sdk에서 지원해주는 keytool로 keystore 파일을 만듭니다. 이 파일은 보안 접속을 하는 서버가 디지털 인증을 암호화 해서 사용하는데 쓰여집니다. 
2. 톰켓의 conf/server.xml 파일에 SSL Connector에 있는 주석을 제거합니다.

keytool은 java가 설치된 in 에서 찾을 수 있습니다. 

%JAVA_HOME%inkeytool -genkey -alias tomcat -keyalg RSA 

위의 명령을 실해하면 keystore 파일이 생성되는데 몇가지 질문을 합니다. 처음으로 패스워드를 물어보는데 톰켓에서 기본적으로 "changeit" 란 패스워드로 셋팅되어 있습니다. 나머지는 원하지 않으면 그냥 엔터키만 치면 됩니다. 

Enter keystore password: changeit 
What is your first and last name? 
[Unknown]: Bruce Perry 
What is the name of your organizational unit? 
[Unknown]: 
What is the name of your organization? 
[Unknown]: 
What is the name of your City or Locality? 
[Unknown]: 
What is the name of your State or Province? 
[Unknown]: 
What is the two-letter country code for this unit? 
[Unknown]: 
Is CN=Bruce Perry, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct? [no]: yes 
Enter key password for <tomcat>
(RETURN if same as keystore password):

다음에 conf/server.xml 에 있는 SSL Connector 요소에 있는 주석을 제거합니다.

<!-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 -->
<connector disableuploadtimeout="true" useurivalidationhack="false" secure="true" scheme="https" debug="0" acceptcount="100" enablelookups="true" maxprocessors="75" minprocessors="5" port="8443" classname="org.apache.coyote.tomcat4.CoyoteConnector">
<factory classname="org.apache.coyote.tomcat4.CoyoteServerSocketFactory" protocol="TLS" clientauth="false" />
</connector>

SSL은 일반 http 가 아닌 https 를 사용합니다. 또한 포트도 웹에서 80, 톰켓에서 8080 처럼 8443의 번호를 사용합니다.

https://localhost:8443/myhome/default.jsp


2. BASIC authentication BASIC Authentication

Basic 인증은 웹자원과 함께 사용되어온 보안 방법이고 거의 모든 브라우져가 이를 지원합니다. 일반적으로 사용자 이름과 비밀번호를 전송할 때 네트워크 상에서 Base64 인코딩 방식을 사용하는데 이는 디코딩하기 아주 쉽기때문에 보안적이라고 할 수 없습니다. 따라서 Basic Authentication 과 SSL 을 사용한 보안 방식을 사용합니다.

1. 먼저 처음에 설명했지만 username, password, role을 conf/tomcat-users.xml 에서 설정합니다.
2. security-constraint element 로 인증에 필요한 자원을 web.xml 파일에 기술합니다.
3. "BASIC"이라고 auth-method요소 사이에 적습니다. 이 auth-method 요소는 login-config요소에 들어갑니다.

<!-- Beginning of web.xml deployment descriptor -->
<security-CONSTRAINT>
<web-RESOURCE-COLLECTION>
<web-RESOURCE-NAME>JSP database component</web-RESOURCE-NAME> 
<url-PATTERN>/myhome.jsp</url-PATTERN> 
<http-METHOD>GET</http-METHOD> 
<http-METHOD>POST</http-METHOD> 
</web-RESOURCE-COLLECTION>
<auth-CONSTRAINT>
<role-NAME>dbadmin</role-NAME> 
</auth-CONSTRAINT>
<user-DATA-CONSTRAINT>
<transport-GUARANTEE>CONFIDENTIAL</transport-GUARANTEE> 
</user-DATA-CONSTRAINT>
</security-CONSTRAINT>
<login-CONFIG>
<auth-METHOD>BASIC</auth-METHOD> 
</login-CONFIG>
<security-ROLE>
<role-NAME>dbadmin</role-NAME> 
</security-ROLE>
<!-- Rest of web.xml deployment descriptor -->

web.xml 을 이렇게 편집한 후에 https://localhost:8443/myhome.jsp 로 들어가보면 아이디와 비밀번호를 입력하라는 창이 뜹니다. 여기서 만일 role 이 dbadmin 이 아니라면 아이디와 비밀번호가 맞아도 인증에 실패하게 됩니다. 반드시 해당 사용자가 인증에 필요한 role을 가지고 있어야 합니다.


3. Form-Based Authentication 의 사용 

서블릿은 일반 BASIC authentication 말고도 사용자 기반 인증인 Form-Based Authentication 제공합니다. 이는 톰켓에서 보여주는 BASIC authentication 의 단순화를 덜어주며 일반적으로 사용하는 form 방식을 사용하기 때문에 이용하기도 편합니다. 이역시 SSL 과 HTTPS를 사용하여 네트워크상에서 이동하는 데이터들을 보호합니다.

먼저 web.xml 셋팅을 보겠습니다. 파일의 맨 처음부분에 보안 관련 element를 기술하게 됩니다. security-constraint 부분은 BASIC authentication 과 같습니다. login-config 셋팅부분이 약간 다르긴 하지만 그렇게 크게 다르지는 않습니다.

<login-CONFIG>
<auth-METHOD>FORM</auth-METHOD>
<form-LOGIN-CONFIG>
<form-LOGIN-PAGE>/login.html</form-LOGIN-PAGE>
<form-ERROR-PAGE>/loginError.jsp</form-ERROR-PAGE>
</form-LOGIN-CONFIG>
</login-CONFIG>

실제 jsp에서 
<form>테그를 사용하여 사용자 정보를 전송하는데 이때 주의할 점은 form 태그의 action 요소의 값을 'j_security_ckeck' 로 하고 사용자 이름과 비밀번호의 이름을 'j_username' 과 'j_password'로 해야합니다. 로그아웃 시에는 HttpSession 객체의 invalidate() 메소드를 호출하면 됩니다.</form>


출처 : http://dreamholic.egloos.com/

Trackback 0 Comment 0