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

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. 참고