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가 인증 및 인가 정보를 저장할 데이터베이스를 설정해야 합니다. 예제를 위해 다음과 같이 users
및 roles
테이블을 생성하겠습니다.
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