개발

어플리케이션 서버를 사용한 인증

Tomcat과 같은 어플리케이션 서버를 사용한 인증 방법을 간단히 정리하면 다음과 같다.

1. 어플리케이션 서버

Tomcat에서는 server.xml 파일에 사용자 지정 Realm 설정을 한다.

예제에서는 member 테이블의 email 컬럼을 사용자명으로, MD5로 암호화된 passwd 컬럼을 암호로 사용하고,

역할은 role 컬럼을 사용하도록 했다.

<Realm className="org.apache.catalina.realm.JDBCRealm"
 driverName="com.mysql.jdbc.Driver"
 connectionURL="jdbc:mysql://localhost:3306/sample?useUnicode=true"
 connectionName="user1" connectionPassword="password"
 userTable="member" userNameCol="email" userCredCol="passwd" digest="MD5"
 userRoleTable="member" roleNameCol="role"
/>

2. 웹 어플리케이션

해당 웹 어플리케이션의 web.xml 파일을 설정한다.
여기에서는 예로 /protected 란 디렉토리의 모든 파일을 요청할 때 인증이 필요하며,
인증된 계정은 Admin이나 SuperAdmin의 Role을 가지고 있어야 한다고 설정했다.

<security-constraint>
 <display-name>보안 설정</display-name>
 <web-resource-collection>
 <web-resource-name>SiteManager</web-resource-name>
  <url-pattern>/protected/*</url-pattern>
  <http-method>GET</http-method>
  <http-method>POST</http-method>
 </web-resource-collection>
 <auth-constraint>
  <description>사이트 관리자</description>
  <role-name>Admin</role-name>
  <role-name>SuperAdmin</role-name>
 </auth-constraint>
</security-constraint>

<login-config>
 <auth-method>FORM</auth-method>
 <realm-name>Site Managers</realm-name>
 <form-login-config>
  <form-login-page>/login.jsp</form-login-page>
  <form-error-page>/login_error.jsp</form-error-page>
 </form-login-config>
</login-config>

<security-role>
 <role-name>Admin</role-name>
</security-role>
<security-role>
 <role-name>SuperAdmin</role-name>
</security-role>

로그인 폼인 login.jsp 파일은 다음과 같이 간단하며 로그인이 성공하면 요청한 페이지로 자동으로 이동된다.

<form method="POST" action="j_security_check">
  <input type="text" name="j_username">
  <input type="password" name="j_password">
  <input type="submit" value="로그인">
</form>

로그인이 되면 다음과 같이 로그인 된 회원 정보를 확인할 수 있다.

String remoteUser = request.getRemoteUser();
java.security.Principal principal = request.getPrincipal();
String username = principal.getName();
boolean isAdmin = request.isUserInRole("Admin");
boolean isSuperAdmin = request.isUserInRole("SuperAdmin");

3. 참고

Windows용 Apache 2.0.4x 에서 SSL 지원하도록 컴파일

현재 Apache에서는 Windows용 Apache 2.0.59 버전이하에서는 SSL을 지원하는 바이너리 파일을 제공하고 있지 않다.

지인의 다급한 요청으로 Windows용 Apache 2.0.4x(2.0.40, 2.0.43)에서 SSL이 지원하도록 컴파일을 해야했다.

필요한 소프트웨어

※ OpenSSL 0.9.8k 과 zlib 1.2.3으로 컴파일을 하려고 했으나 Apache 소스와 호환이 되지 않는 문제가 있었다.

컴파일 준비

OpenSSL 준비 및 컴파일

다운로드 받은 OpenSSL 소스를 Apache 소스의 srclib 디렉토리안에 압축 해제하고 openssl 디렉토리명으로 변경하고

Perl을 사용하여 Makefile을 생성하여 Visual C++에 포함된 nmake를 사용하여 컴파일 한다.

C:\httpd-2.0.40\srclib> ren openssl-0.9.7m openssl
C:\httpd-2.0.40\srclib> cd openssl
perl Configure VC-WIN32 --prefix=c:/USR/openssl
perl util\mkfiles.pl >MINFO
perl util\mk1mf.pl dll no-asm no-mdc2 no-rc5 no-idea VC-WIN32 > Makefile.win
perl util\mk1mf.pl dll debug no-asm no-mdc2 no-rc5 no-idea VC-WIN32 > Makefile.dbg
perl util\mkdef.pl 32 libeay no-asm no-mdc2 no-rc5 no-idea > ms\libeay32.def
perl util\mkdef.pl 32 ssleay no-asm no-mdc2 no-rc5 no-idea > ms\ssleay32.def
nmake -f Makefile.win
nmake -f Makefile.dbg

zlib 준비

다운받은 zlib 소스를 역시 Apache 소스의 srclib 디렉토리 안에 압축 해제하고 zlib 디렉토리명으로 변경한다.

zlib는 사전에 컴파일 할 필요가 없다.

C:\httpd-2.0.40\srclib> ren zlib-1.1.4 zlib

Makefile 수정

Visual C++의 IDE에서 컴파일을 해도 되지만 편의를 위해서 명령 프롬프트에서 컴파일할 수 있도록 Makefile을 수정한다.

이렇게 수정하는 이유는 Apache 소스에 포함된 Makefile이 OpenSSL 0.9.7m 및 zlib 1.1.4 소스의 정의 값이 일치하지 않기 때문이다.

  1. Visual C++ 실행 > Project > Setting 메뉴 선택
  2. 왼쪽의 빌드 대상에서 abs 를 선택하고, Settings For를 All Configurations 로 선택
  3. 오른쪽의 C/C++ 탭을 선택하고 Preprocessor definitions에 ,OPENSSL_NO_RC5,OPENSSL_NO_IDEA,OPENSSL_NO_MDC2 추가 (처음에 콤마가 있어야 하며 이미 동일한 정의 값이 있는 경우는 필요 없음)
  4. 왼쪽의 빌드 대상에서 mod_deflate 를 선택하고, Settings For를 All Configurations 로 선택
  5. 오른쪽의 C/C++ 탭을 선택하고 Preprocessor definitions에 ,_WIN32 추가
  6. 왼쪽의 빌드 대상에서 mod_ssl 을 선택하고, Settings For를 All Configurations 로 선택
  7. 오른쪽의 C/C++ 탭을 선택하고 Preprocessor definitions에 ,OPENSSL_NO_RC5,OPENSSL_NO_IDEA,OPENSSL_NO_MDC2 추가 (이미 있는 경우는 필요 없음)
  8. OK 클릭
Visual C++ 6.0 Project Setting

Visual C++ 6.0 Project Setting

  1. Project > Export Makefile 메뉴 선택
  2. 기본적으로 모두 선택되어 있으므로 Select All 클릭 후 선택항목를 클릭하여 모두 선택 해제
  3. abs, mod_deflate와 mod_ssl 만 체크하고 OK 클릭
Visual C++ 6.0 Project Export Make

Visual C++ 6.0 Project Export Make

컴파일

이제 모든 컴파일 준비가 끝났다.

컴파일 대상은 다음과 같다.

  • _apacher: 릴리즈 모드로 컴파일
  • _apached: 디버그 모드로 컴파일
  • installr: 릴리즈 모드로 컴파일 후 설치
  • installd: 디버그 모드로 컴파일 후 설치
  • clean: 생성된 파일 삭제
  • _cleanr: 릴리즈 모드로 컴파일 할 때 생성한 파일 삭제
  • _cleand: 디버그 모드로 컴파일 할 때 생성한 파일 삭제

선택 사항은 다음과 같다.

  • INSTDIR: 설치 디렉토리 (기본 값: Apache2)
  • PORT: 포트 (80)
  • SERVERNAME: 서버명 (localhost)

예로는 포트 번호를 80으로 설정하고 설치 디렉토리를 C:USRApache-2.0.40으로 지정하고 릴리즈 모드로 컴파일 하고 설치하도록 했다.

C:\httpd-2.0.40> nmake /f Makefile.win PORT=80 INSTDIR="C:\USR\Apache-2.0.40" installr

참고

Oracle SQL Developer로 MySQL, MS SQL Server 사용하기

개요

Mac OS X에서 MySQL을 질의할 때 사용하던 것이 MySQL Query Browser이다.

Windows 버전과는 다르게 Mac용의 최대 단점은 Query의 창이 너무 작다는 점과 하나의 Query 창에 여러 개의 질의를 사용할 수 없다는 것이다.

물론 MySQL Query Browser의 Windows 버전은 한글을 제대로 입력할 수 없다는 치명적인 결점이 있다.

Mac에서 MySQL 뿐 아니라 MS SQL Server에 대한 질의가 필요했는 데 이 모든 문제를 해결할 수 있는 것은

다름 아닌 Oracle SQL Developer이다.

Oracle 제품이니 당연히 Oracle 데이터베이스만 지원될 것으로 생각하기 쉽지만

SQL Developer는 Java기반으로 개발되었기 때문에 Mac, Windows와 같은 다중 플랫폼 지원 뿐 아니라

JDBC를 지원하는 여러 데이터베이스를 이용할 수 있다.

Oracle SQL Developer Connection

Oracle SQL Developer Connection 생성 화면

위 그림을 보면 Oracle, MySQL, SQL Server, 그리고 Sybase를 볼 수 있다.

설정

JDBC 드라이버 파일을 특정 디렉토리에 넣고 다음과 같이 설정한다.

(1) Oracle SQL Developer 실행

(2) Tools 메뉴 > Preferences 메뉴 클릭

(3) Preferences 창에서 Database > Third Party JDBC Drivers 클릭

(4) Add Entry를 누르고 추가할 JDBC 드라이버를 선택하여 추가

JDBC 드라이버

  • MySQL: mysql-connector-java-5.1.7-bin.jar 파일
  • SQL Server 및 Sybase:  jtds-1.2.2.jar 파일

※ MS에서 제공하는 JDBC 드라이버도 테스트해봤지만 궁합이 안맞는지 SQL Server 탭이 생성되지 않았다.

참고