[java] Apache Shiro와 JWT 토큰 검증

Apache Shiro는 자바 기반의 오픈 소스 보안 프레임워크로, 인증 및 권한 관리를 위한 다양한 기능을 제공합니다. JWT(토큰 기반 웹 인증)은 인증된 사용자를 식별하기 위해 사용되는 토큰입니다. 이번 글에서는 Apache Shiro를 사용하여 JWT 토큰을 검증하는 방법에 대해 알아보겠습니다.

1. Shiro 설정

Apache Shiro를 사용하기 위해 먼저 Maven 또는 Gradle 등을 사용하여 Shiro를 프로젝트에 추가해야 합니다. 예를 들어 Maven의 경우, pom.xml 파일에 다음 의존성을 추가합니다:

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

2. JWT 토큰 검증

JWT 토큰을 검증하기 위해 Shiro에서 제공하는 JWTToken 클래스를 사용합니다. 검증을 위해 필요한 키나 비밀은 별도로 설정해야 합니다. 다음은 간단한 예제 코드입니다:

import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

public class JWTRealm extends AuthorizingRealm {

    @Override
    public boolean supports(AuthenticationToken token) {
        return token instanceof JWTToken;
    }

    // JWT 토큰을 검증하는 로직을 구현합니다.
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) {
        JWTToken jwtToken = (JWTToken) token;
        String jwt = jwtToken.getCredentials();
        
        // JWT 토큰 검증 로직
        // ...

        // 검증에 성공하면 사용자 정보를 리턴합니다.
        return new SimpleAuthenticationInfo(jwt, jwt, getName());
    }
    
    // 권한 정보를 설정하는 로직을 구현합니다.
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        // ...
    }
}

위의 코드에서 doGetAuthenticationInfo 메서드에서 JWT 토큰 유효성 검사 로직을 구현하면 됩니다. 검증에 성공하면 SimpleAuthenticationInfo를 리턴하며, 사용자 정보는 JWT 토큰 자체를 사용합니다.

3. Shiro 설정 파일 수정

위에서 작성한 JWTRealm 클래스를 Shiro 설정 파일에 등록해야 합니다. shiro.ini 또는 shiro.yml 파일을 열어 다음과 같이 설정합니다:

[main]
jwtRealm = com.example.JWTRealm

[urls]
/** = jwt

이렇게 설정하면 모든 URL에 대해 JWT 토큰 인증을 수행하게 됩니다. 필요에 따라 URL 패턴을 변경할 수 있습니다.

4. JWT 토큰 생성 및 검증하기

실제로 JWT 토큰을 생성하고 검증하기 위해서는 해당 기능을 구현해야 합니다. 일반적으로 JWT 라이브러리를 사용하거나 직접 구현할 수 있습니다.

위의 JWTRealm 클래스에서 검증 로직을 구현할 때에는 JWT 라이브러리를 사용하여 토큰을 검증하는 것이 일반적입니다. 필요에 따라 토큰의 유효 기간, 암호화, 발급자 등을 검증할 수 있습니다.

마무리

Apache Shiro와 JWT를 함께 사용하여 토큰 기반의 인증을 구현하는 방법에 대해 알아보았습니다. 이를 통해 보다 안전하고 유연한 웹 애플리케이션을 개발할 수 있습니다.

참고: