Logto 를 통해 JWT 액세스 토큰에 사용자 지정 클레임을 추가해 권한 강화하기
이 기사에서는 실제 예제를 통해 Logto 의 사용자 지정 JWT 클레임 기능을 사용하여 권한 부여의 유연성을 향상시키고 서비스 제공자의 성능을 개선하는 방법을 소개합니다.
이전 기사에서, 점점 더 많은 시스템이 사용자 인증 및 액세스 제어를 위해 JWT 형식의 액세스 토큰을 사용하고 있다고 언급한 바 있습니다. 그 중요한 이유 중 하나는 JWT 가 사용자 역할 및 권한과 같은 유용한 정보를 포함할 수 있기 때문입니다. 이러한 정보는 서버와 클라이언트 간에 사용자 신원 정보를 전달하는 데 도움을 주어 사용자 인증 및 액세스 제어를 구현할 수 있습니다.
보통 JWT 에 포함된 정보는 인증 서버에 의해 결정됩니다. OAuth 2.0 프로토콜에 따르면, JWT 는 일반적으로 sub
(주체), aud
(청중), exp
(만료 시간)과 같은 필드를 포함하는데, 이러한 필드들을 클레임이라고 합니다. 이러한 클레임은 액세스 토큰의 유효성을 확인하는 데 도움을 줄 수 있습니다.
그러나 JWT 가 확인에 사용되는 시나리오는 무수히 많으며, 일반적인 JWT 클레임이 종종 사용자 요구를 충족시키지 못할 수 있습니다. 사람들은 종종 JWT 가 정보를 포함할 수 있다면, 권한 부여를 더 쉽게 하기 위해 일부 정보를 추가할 수 있을까 생각합니다.
답은 YES 입니다. 우리는 JWT 에 커스텀 클레임을 추가할 수 있으며, 예를 들어 현재 사용자의 범위(scope)와 구독 레벨을 포함할 수 있습니다. 이렇게 하면 클라이언트와 서버 간(여기서 서버는 다양한 서비스를 제공하는 서버, 즉 서비스 제공자를 의미합니다) 사용자 신원 정보를 전달하여 사용자 인증 및 액세스 제어를 달성할 수 있습니다.
표준 JWT 클레임에 대한 자세한 내용은 RFC7519 를 참조하십시오. Logto 는 인증과 권 한 부여를 모두 지원하는 아이덴티티 솔루션으로서, 표준 RBAC 을 지원하기 위해 리소스 및 범위 클레임을 확장하였습니다. 비록 Logto 의 RBAC 구현이 표준적일지라도, 모든 사용 사례에 적합할 만큼 간단하거나 유연하지는 않습니다.
이를 바탕으로 Logto 는 JWT 클레임을 사용자 지정할 수 있는 새로운 기능을 출시하여, 사용자 인증 및 액세스 제어를 더욱 유연하게 구현할 수 있도록 하였습니다.
Logto 의 사용자 지정 JWT 클레임은 어떻게 작동합니까?
사이드바에서 "JWT claims" 버튼을 클릭하면 사용자 지정 JWT 목록 페이지로 이동할 수 있습니다.
최종 사용자에 대한 사용자 지정 클레임 추가부터 시작하겠습니다.
왼쪽의 편집기에서 getCustomJwtClaims
함수를 사용자 지정할 수 있습니다. 이 메서드는 token
, data
, envVariables
세 가지 입력 매개변수를 가집니다.
token
은 현재 최종 사용자의 자격 증명과 시스템 설정을 기반으로 얻은 원시 액세스 토큰 페이로드이며, Logto 에서 사용자 액세스 관련 정보를 포함합니다.data
는 Logto 에서의 사용자에 대한 모든 정보로, 모든 사용자 역할, 소셜 로그인 ID, SSO ID, 조직 멤버십 등을 포함합니다.envVariables
는 Logto 에서 현재 최종 사용자 액세스 토큰 사용 시나리오를 위해 구성한 환경 변수로, 필요한 외부 API 의 API 키(API key) 등을 의미합니다.
오른쪽의 카드들은 해당 매개변수의 소개를 보여주기 위해 확장할 수 있으며, 여기서 현재 시나리오에 대한 환경 변수를 설정할 수도 있습니다.
오른쪽 카드의 소개를 모두 읽은 후 테스트 모드로 전환하여, 테스트 데이터를 편집하고 왼쪽 코드 편집기에서 작성한 스크립트의 동작이 예상에 부합하는지 확인할 수 있습니다.
이것은 최종 사용자가 Logto 에 인증 요청을 하고 Logto 에서 반환한 JWT 형식의 액세스 토큰을 결국 획득할 때 getCustomJwtClaims
함수의 실행 과정을 보여주는 시퀀스 다이어그램입니다.
Custom JWT 기능이 활성화되지 않은 경우, 그림의 3단계는 건너뛰고 2단계가 종료되는 즉시 4단계가 실행됩니다. 이 시점에서 Logto 는 getCustomJwtClaims
의 반환 값을 빈 객체로 간주하고, 이후 단계를 계속 진행합니다.
사용자 지정 JWT 클레임으로 권한 강화하기: 실제 예제
이전 섹션에서는 Logto 커스텀 JWT 의 작동 원리를 소개했습니다. 이번 부분에서는 Logto 커스텀 JWT 클레임을 사용하여 권한 부여의 유연성을 향상시키고 서비스 제공자의 성능을 개선하는 방법을 실제 예제를 통해 제공합니다.
시나리오 설정
John 의 팀은 사용자가 AI 로봇과 대화하여 다양한 서비스를 제공받을 수 있는 AI Assistant App 을 개발했습니다.
AI 로봇 서비스는 무료 서비스와 유료 서비스로 나뉘어집니다. 무료 서비스에는 특별 항공권 추천이 포함되며, 유료 서비스에는 주식 예측이 포함됩니다.
AI Assistant App 은 Logto 를 사용하여 모든 사용자를 관리하며, 사용자는 무료 사용자, 선불 사용자, 프리미엄 사용자로 나뉩니다. 무료 사용자는 무료 서비스만 사용할 수 있고, 선불 사용자는 모든 서비스를 사용할 수 있으며(사용량에 따라 요금 부과), 프리미엄 사용자는 모든 서비스를 사용할 수 있습니다(악의적인 사용을 방지하기 위한 속도 제한이 있음).
또한, AI Assistant App 은 Stripe 를 사용하여 사용자 결제를 관리하고, 자체 로그 서비스를 사용하여 사용자 운영 로그를 기록합니다.
Logto 설정
먼저 AI Assistant App 서비스에 대한 API 리소스를 생성하고 recommend:flight
및 predict:stock
두 개의 범위를 생성합니다.
그런 다음 두 개의 roles
, free-user
및 paid-user
를 생성하고 해당 범위를 할당합니다:
recommend:flight
범위를free-user
역할에 할당합니다.recommend:flight
및predict:stock
범위를 모두paid-user
역할에 할당합니다.
마지막으로 free-user
, prepaid-user
, premium-user
세 명의 사용자를 생성하고 해당 역할을 할당합니다:
free-user
역할을free-user
사용자의 역할로 할당합니다.paid-user
역할을prepaid-user
및premium-user
사용자의 역할로 할당합니다.
아래 그림에 표시된 것처럼, 위의 시나리오에 필요한 권한 정보를 구현하기 위해 현재 로그인한 사용자의 roles
, balance
, 및 numOfCallsToday
정보를 JWT 에 포함시키고자 합니다. AI Assistant App 에서 액세스 토큰을 확인할 때 이러한 정보를 사용하여 빠르게 권한 검증을 수행할 수 있습니다.
envVariables
를 설정한 후, getCustomJwtClaims
함수를 구현하고 "Run test" 버튼을 클릭하여 현재 테스트 데이터를 기반으로 추가 JWT 클레임의 결과를 확인하세요.
우리가 data.user.roles
에 대한 테스트 데이터를 구성하지 않았기 때문에, 결과에 나타난 roles
는 빈 배열입니다.
사용자 지정 JWT 기능이 발동되는지 확인하기
앞서 설명한 Logto 설정에 따라 테스트에서 해당 결과를 얻었습니다. 다음으로, Logto 에서 제공하는 샘플 앱을 사용하여 우리의 사용자 지정 JWT 가 효과적인지 확인하겠습니다. Logto SDKs 에서 익숙한 SDK 를 찾아 문서와 해당 GitHub 저장소에 따라 샘플 앱을 배포합니다.
여기서 설명한 설정에 따라, React SDK 를 예로 들어 LogtoConfig 에서 해당 설정을 업데이트해야 합니다:
사용자 free_user
로 로그인하여 AI Assistant App 을 시뮬레이션하는 샘플 앱을 통해 JWT 액세스 토큰의 페이로드 부분을 보면 우리가 추가한 roles
, balance
, numOfCallsToday
, isPaidUser
및 isPremiumUser
정보를 확인할 수 있습니다.
balance
, numOfCallsToday
, isPaidUser
및 isPremiumUser
의 값은 이전 테스트와 일치하며, roles
는 ["free-user"]
입니다. 이는 실제 최종 사용자 로그인 과정에서 사용자가 접근할 수 있는 모든 데이터를 가져와 적절히 처리하기 때문입니다.
프리미엄 사용자의 경우, roles
가 ["paid-user"]
이며 isPaidUser
와 isPremiumUser
모두 true
임을 확인할 수 있습니다.
서비스 제공자 권한 부여 로직 업데이트
앞의 단계에서 비즈니스 요구 사항에 기반한 사용자 지정 클레임을 사용자 액세스 토큰에 추가했습니다. 다음으로, 이 클레임을 사용하여 빠르게 권한 검증을 수행할 수 있습니다.
다음은 Logto 가 API 측에서 JWT 액세스 토큰을 검증하는 로직입니다. 전체 코드 구현은 GitHub repo 에서 찾을 수 있습니다:
Logto API 의 액세스 토큰 검증 로직을 참고하고, 자체 비즈니스 로직에 맞게 커스터마이즈할 수 있습니다. 예를 들어, 여기서 설명한 AI Assistant App 시나리오의 경우 verifyBearerTokenFromRequest
함수에 roles
, balance
, numOfCallsToday
, isPaidUser
및 isPremiumUser
와 같은 사용자 지정 클레임에 대한 검증 로직을 추가할 수 있습니다.
위의 예제는 최종 사용자의 로그인 및 JWT 액세스 토큰 획득에 영향을 미치는 시나리오에 대한 것입니다. 만약 당신의 사용 사례가 머신 간(M2M) 이라면, M2M 앱에 대해 별도의 사용자 지정 JWT 클레임을 구성할 수도 있습니다.
사용자를 위한 사용자 지정 JWT 를 구성한다고 해서 M2M 앱이 액세스 토큰을 획득할 때의 결과에 영향을 미치지 않으며, 그 반대의 경우도 마찬가지입니다.
M2M 연 결의 일반성 때문에, Logto 는 현재 M2M 앱의 getCustomJwtClaims
메서드가 Logto 의 내부 데이터를 수락하는 기능을 제공하지 않습니다. 이 외에, M2M 앱에 대한 사용자 지정 JWT 설정 방법은 사용자 앱과 동일합니다. 이 기사는 이에 대해 자세히 설명하지 않으며, Logto 의 사용자 지정 JWT 기능을 사용하여 시작할 수 있습니다.
왜 사용자 지정 JWT 클레임을 사용해야 합니까?
우리는 John 의 AI Assistant App 시나리오와 Logto 의 사용자 지정 JWT 기능을 사용하여 더 유연한 권한 검증을 달성하는 방법을 제공했습니다. 이 과정에서 사용자 지정 JWT 기능의 장점을 볼 수 있었습니다:
- 사용자 지정 JWT 기능 없이 사용자는 매번 권한을 확인할 때 외부 API (예:
getCustomJwtClaims
에서 수행하는 작업) 를 요청해야 합니다. 이 API 를 제공하는 서비스 제공자에게는 이로 인해 추가적인 부담이 증가할 수 있습니다. 사용자 지정 JWT 기능을 사용하면 이러한 정보를 직접 JWT 에 넣을 수 있어 외부 API 의 자주 호출을 줄일 수 있습니다. - 서비스 제공자 측에서는 사용자 지정 JWT 기능이 사용자 권한을 더 빠르게 검증하는 데 도움이 될 수 있으며, 특히 클라이언트가 서비스 제공자를 자주 호출할 때 서비스 성능을 향상시킬 수 있습니다.
- 사용자 지정 JWT 기능은 비즈니스에 필요한 추가 권한 정보를 빠르게 구현할 수 있으며, JWT 는 자체적으로 포함된 정보를 통해 클라이언트와 서비스 제공자 간에 정보를 안전하게 전달할 수 있기 때문에 위조하기 어렵습니다.
동시에, getCustomJwtClaims
은 사용자가 Logto 에서 액세스 토큰을 발급 받을 때마다 실행되므로, 지나치게 복잡한 로직이나 고대역폭이 필요한 외부 API 요청 실행을 피해야 합니다. 그렇지 않으면, 사용자 로그인을 기다리는 동안 getCustomJwtClaims
의 결과를 기다리는 시간이 길어질 수 있습니다. 만약 getCustomJwtClaims
이 빈 객체를 반환한다면, 실제로 사용해야 할 때까지 이 설정 항목을 일시적으로 삭제할 것을 강력히 권장합니다.
결론
이 기사에서, Logto 는 기본 JWT 액세스 토큰을 확장하고 추가 JWT 클레임 기능을 확장하여 사용자가 비즈니스 요구 사항에 따라 추가적인 최종 사용자 정보를 JWT 액세스 토큰에 넣을 수 있도록 하였습니다. 이를 통해 사용자가 로그인한 후, 사용자의 권한을 빠르게 검증할 수 있습니다.
우리는 John 의 AI Assistant App 시나리오를 제공하고, Logto 의 사용자 지정 JWT 기능을 사용하여 더 유연한 권한 검증을 달성하는 방법을 시연하였습니다. 또한 사용자 지정 JWT 를 사용할 때의 몇 가지 주요 포인트를 지적하였습니다. 실제 비즈니스 시나리오와 결합하여, 사용자는 비즈니스 요구 사항에 따라 다양한 사용자 관 련 정보를 JWT 액세스 토큰에 넣어 서비스 제공자가 사용자의 권한을 빠르게 확인할 수 있도록 할 수 있습니다.