[java] Apache Shiro의 인증 기능

Apache Shiro는 Java용 보안 프레임워크로, 인증, 권한 부여, 세션 관리 등의 기능을 제공합니다. 이 문서에서는 Apache Shiro의 인증 기능에 대해서 자세히 알아보겠습니다.

1. 인증(Authentication)이란?

인증은 사용자의 신원을 확인하는 과정입니다. Apache Shiro는 다양한 인증 메커니즘을 지원하며, 사용자 이름과 비밀번호, X.509 인증서 등 다양한 방법을 통해 사용자를 인증할 수 있습니다.

인증은 Subject라는 개념을 사용하여 수행됩니다. Subject는 현재 인증된 사용자를 나타냅니다. Apache Shiro에서는 Subject 인터페이스를 통해 사용자를 대표하며, 인증 결과를 받아오거나 인증된 사용자에 대한 권한 검사를 수행할 수 있습니다.

2. 인증 설정하기

Apache Shiro를 사용하여 인증 기능을 사용하려면, 먼저 애플리케이션의 환경에 맞게 인증 설정을 해야 합니다. 인증 설정은 보통 애플리케이션의 설정 파일에 정의하며, Apache Shiro는 다양한 설정 방식을 지원합니다.

예를 들어, 아래는 Apache Shiro를 사용하여 사용자 이름과 비밀번호를 이용한 폼 기반 인증을 설정하는 예입니다.

[main]
myRealm = com.example.MyRealm

[users]
user1 = password1, role1
user2 = password2, role2

[roles]
role1 = permission1, permission2
role2 = permission3, permission4

[urls]
/login = authc
/admin/** = authc, roles[role1]

위 예제에서는 MyRealm 클래스를 사용하여 인증을 수행하고, users 섹션에서 사용자와 비밀번호, 역할 정보를 정의합니다. roles 섹션에서는 역할과 해당 역할에 부여된 권한을 설정할 수 있습니다. urls 섹션에서는 URL 패턴에 따라 인증과 권한 검사를 적용할 수 있습니다.

3. 인증 수행하기

인증 설정을 완료한 후에는 실제로 인증을 수행해야 합니다. Apache Shiro에서는 SecurityUtils 클래스를 사용하여 인증을 수행할 수 있습니다.

아래 예제는 사용자 이름과 비밀번호를 이용하여 인증하는 코드입니다.

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;

public class AuthenticationExample {
    public static void main(String[] args) {
        // Get the currently executing subject
        Subject currentUser = SecurityUtils.getSubject();

        // Collect user-specific input in this example
        String username = "user1";
        String password = "password1";
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);

        try {
            // Execute the login
            currentUser.login(token);
            // 인증 성공
        } catch (AuthenticationException e) {
            // 인증 실패
        }
    }
}

위 예제에서는 SecurityUtils.getSubject()를 사용하여 현재 실행 중인 Subject를 가져옵니다. UsernamePasswordToken을 생성하여 사용자 이름과 비밀번호를 설정한 후, currentUser.login(token)을 호출하여 인증을 수행합니다. 인증이 성공하면 AuthenticationException은 발생하지 않고, 인증이 실패하면 AuthenticationException이 발생합니다.

4. 인증 결과 사용하기

인증이 완료되면, Subject를 통해 사용자의 신원을 확인하고 권한 검사 등을 수행할 수 있습니다. Subject 인터페이스는 다양한 메소드를 제공하며, 이를 통해 인증된 사용자의 정보와 권한을 확인할 수 있습니다.

아래 예제는 인증된 사용자의 역할과 권한을 출력하는 코드입니다.

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import java.util.Arrays;

public class AuthorizationExample {
    public static void main(String[] args) {
        // Get the currently executing subject
        Subject currentUser = SecurityUtils.getSubject();

        // Check if the current user has the 'role1' role
        if (currentUser.hasRole("role1")) {
            System.out.println("User has role1");
        } else {
            System.out.println("User does not have role1");
        }

        // Check if the current user has the 'permission1' permission
        if (currentUser.isPermitted("permission1")) {
            System.out.println("User has permission1");
        } else {
            System.out.println("User does not have permission1");
        }

        // Display all roles and permissions of the current user
        System.out.println("Roles: " + Arrays.toString(currentUser.getRoles()));
        System.out.println("Permissions: " + Arrays.toString(currentUser.getPermissions()));
    }
}

위 예제에서는 SecurityUtils.getSubject()를 사용하여 현재 실행 중인 Subject를 가져옵니다. hasRole() 메소드를 호출하여 사용자가 특정 역할을 가지고 있는지 확인하고, isPermitted() 메소드를 호출하여 사용자가 특정 권한을 가지고 있는지 확인합니다. getRoles()getPermissions() 메소드를 통해 인증된 사용자의 역할과 권한을 배열로 받아올 수 있습니다.

5. 참고 자료

Apache Shiro의 공식 문서: https://shiro.apache.org/

Apache Shiro의 GitHub 저장소: https://github.com/apache/shiro