[java] Apache Shiro와 RDBMS 연동

Apache Shiro는 자바 기반의 오픈 소스 보안 프레임워크입니다. Shiro를 사용하면 간단하게 인증, 인가 및 세션 관리를 구현할 수 있습니다. 이번 글에서는 Apache Shiro를 사용하여 RDBMS와 연동하는 방법을 알아보겠습니다.

1. 의존성 추가

Apache Shiro가 RDBMS와 통합하기 위해서는 JDBC 드라이버 의존성을 추가해야 합니다.

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-core</artifactId>
    <version>1.8.0</version>
</dependency>

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-web</artifactId>
    <version>1.8.0</version>
</dependency>

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-jdbc</artifactId>
    <version>1.8.0</version>
</dependency>

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-crypto-hash</artifactId>
    <version>1.8.0</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.11</version>
</dependency>

이 예제에서는 MySQL을 사용하므로 mysql-connector-java 의존성도 추가했습니다.

2. 데이터베이스 구성

먼저, Shiro가 인증 및 인가 정보를 저장할 데이터베이스를 설정해야 합니다. 예제를 위해 다음과 같이 usersroles 테이블을 생성하겠습니다.

CREATE TABLE `users` (
  `username` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  `enabled` tinyint(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `roles` (
  `role_name` varchar(255) NOT NULL,
  `username` varchar(255) NOT NULL,
  PRIMARY KEY (`role_name`,`username`),
  KEY `fk_roles_users_idx` (`username`),
  CONSTRAINT `fk_roles_users` FOREIGN KEY (`username`) REFERENCES `users` (`username`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3. Shiro 설정

다음으로, Shiro 구성 파일(shiro.ini 또는 shiro.ini)에서 RDBMS 연결 정보 및 사용자 인증 및 인가를 구성해야 합니다.

[main]
jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
dataSource = org.apache.shiro.jndi.JndiObjectFactory
dataSource.resourceName = jdbc/myDataSource

# 데이터베이스 연결 정보 설정
jdbcRealm.dataSource = $dataSource
jdbcRealm.permissionsLookupEnabled = true

# 사용자 쿼리 및 인증 쿼리 설정
jdbcRealm.authenticationQuery = SELECT password FROM users WHERE username = ?
jdbcRealm.userRolesQuery = SELECT role_name FROM roles WHERE username = ?

# 해싱 알고리즘 및 솔트 설정
jdbcRealm.hashAlgorithmName = SHA-256
jdbcRealm.hashIterations = 1000
jdbcRealm.saltStyle = COLUMN

# 로그인 URL 설정
authc.loginUrl = /login

위의 예제에서는 데이터베이스 연결 정보를 JNDI를 통해 가져오도록 설정했습니다. jdbc/myDataSource는 web.xml에서 정의된 리소스 이름입니다. 필요에 따라 데이터베이스 연결 정보를 직접 설정할 수도 있습니다.

4. 웹 애플리케이션 설정

마지막으로, 웹 애플리케이션의 web.xml 파일에 Shiro 필터 및 리스너를 설정해야 합니다.

<filter>
    <filter-name>ShiroFilter</filter-name>
    <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>ShiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<listener>
    <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
</listener>

ShiroFilter는 모든 요청을 가로채고 인증 및 인가를 수행합니다. EnvironmentLoaderListener는 Shiro 환경을 초기화하는 역할을 합니다.

결론

이제 Apache Shiro와 RDBMS를 연동하는 방법을 알아보았습니다. Shiro를 사용하여 웹 애플리케이션의 보안을 강화하고 사용자 인증 및 인가를 처리할 수 있습니다. 더 많은 기능과 설정 옵션을 활용하여 Shiro를 최대한 활용해보세요.

참고: Apache Shiro, Apache Shiro - JDBC Realm