[java] Java 프로젝트에서 Apache Shiro 사용하기

Apache Shiro는 Java 애플리케이션에서 인증, 권한 부여 및 세션 관리와 같은 보안 기능을 처리하기 위한 강력하고 유연한 라이브러리입니다. 이 글에서는 Java 프로젝트에서 Apache Shiro를 사용하는 방법을 알아보겠습니다.

1. Maven 또는 Gradle에 의존성 추가하기

Apache Shiro를 프로젝트에 추가하기 위해, Maven 또는 Gradle 빌드 도구에 의존성을 추가해야 합니다. 이를 위해 pom.xml 또는 build.gradle 파일을 열고 아래의 의존성을 추가하세요.

Maven:

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

Gradle:

implementation 'org.apache.shiro:shiro-core:1.7.1'

2. Shiro 구성하기

Shiro를 사용하기 위해 애플리케이션의 shiro.ini 또는 shiro.yml 등의 설정 파일을 생성하고 필요한 구성을 추가해야 합니다. 이 파일을 사용하여 인증, 권한 부여, 세션 관리 등의 설정을 지정할 수 있습니다.

아래는 shiro.ini 파일의 예시입니다:

[main]
# 사용할 Realm 구성
authcRealm = com.example.MyRealm

# 자격 증명 정보를 저장할 Cache 구성
credentialsMatcher = org.apache.shiro.authc.credential.HashedCredentialsMatcher
credentialsMatcher.hashAlgorithmName = SHA-256
credentialsMatcher.storedCredentialsHexEncoded = false

credentialsMatcher = $credentialsMatcher

[urls]
# URL 패턴에 대한 접근 권한 설정
/** = anon
/admin/** = authc, roles[admin]

3. 사용자 정의 Realm 구현하기

Shiro에서는 Realm이 실제로 인증과 권한 검증을 처리하는 주요 구성 요소입니다. 따라서 애플리케이션에 맞게 사용자 정의 Realm을 구현해야 합니다.

아래는 간단한 사용자 정의 Realm의 예시입니다:

public class MyRealm extends AuthorizingRealm {

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        // 사용자 인증 정보를 가져오는 로직 구현
    }

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        // 사용자 권한 정보를 가져오는 로직 구현
    }
}

4. 인증과 권한 부여 사용하기

Java 코드에서 Shiro를 사용하여 인증과 권한 부여를 처리할 수 있습니다. 애플리케이션의 로그인 요청 처리와 같은 곳에서 아래와 같이 사용할 수 있습니다:

Subject currentUser = SecurityUtils.getSubject();

if (!currentUser.isAuthenticated()) {
    UsernamePasswordToken token = new UsernamePasswordToken(username, password);

    try {
        currentUser.login(token);
    } catch (IncorrectCredentialsException ice) {
        // 패스워드가 일치하지 않을 때의 처리
    } catch (LockedAccountException lae) {
        // 계정이 잠겨 있을 때의 처리
    } catch (AuthenticationException ae) {
        // 인증 예외 발생시의 처리
    }
}

if (currentUser.hasRole("admin")) {
    // admin 권한에 따른 처리
} else {
    // 일반 사용자에 따른 처리
}

5. 추가 자원

Apache Shiro를 사용하여 Java 프로젝트에서 보안을 구현할 수 있습니다. Shiro는 강력하면서도 사용이 간편하며, 다양한 인증 및 권한 부여 방식을 지원합니다.