Logto x Hasura: JWT 를 사용한 접근 제어
이 종합 가이드는 Logto 와 Hasura 의 JWT 모드 접근 제어를 통합하는 데 필요한 단계를 설명하여 데이터 보안을 효과적으로 강화하는 방법을 다룹니다.
Hasura 는 데이터에 맞는 GraphQL 및 REST API 를 빠르게 제공할 수 있는 도구입니다. 데이터 보안을 고려하여, Hasura 는 각각의 다른 API 에 대해 세부적으로 접근 제어를 조정할 수 있는 기능도 제공합니다.
보통 Hasura 사용자들은 Logto 와 같은 인기 있는 신원 관리 및 인증 서비스를 많이 이용합니다.
이 블로그 포스트에서는 여러분이 이미 Hasura 서비스를 사용하고 있다고 가정하겠습니다. 우리는 Hasura 와 Logto 를 통합하여 데이터 보안을 최대화하는 방법을 소개할 것입니다. Logto 계정이 없으신 경우, 지금 가입하고 사용을 시작하세요!
배경
Hasura 는 역할 기반 접근 관리 를 채택하고 있으며, Logto 는 표준 역할 기반 접근 제어 (RBAC) 를 사용합니다.
Logto 의 모델 및 RBAC 의 모범 사례에서 우리는 사용자가 권한의 가장 세부적인 단위를 나타내기 위해 scope
을 사용하고, role
은 편리한 일괄 작업을 위해 여러 scope
을 묶은 것으로 사용하며, 궁극적으로 자원 제공자 측에서 scope
을 확인하여 사용자가 특정 작업을 수행할 수 있는지 여부를 확인할 것을 권장합니다.
Hasura 에서는 role
이 권한의 가장 세부적인 단위를 나타내며, 이들에 대한 권한 확인이 role
을 기반으로 이루어집니다. 따라서 Logto 설정 시, 하나의 role
을 정확히 하나의 scope
에 매핑하는 것을 권장합니다. 이러한 접근 방식은 Logto 와 Hasura 의 권한을 함께 연결하여 혼란과 오용을 방지할 수 있습니다.
Hasura 는 Webhooks 나 JWT 를 사용하여 접근 제어를 지원할 수 있습니다. 이전 블로그 게시물 에서는 Webhooks 사용하는 방법을 소개했으며, 다음 섹션에서는 Hasura 의 JWT 모드 접근 제어를 활용하는 방법을 설명하겠습니다.
시작하기
간단한 예제로 시작해 보겠습니다. 사용자가 이미 Hasura 에서 GET /user
및 PATCH /user
두 가지 API 를 가지고 있으며, 각각 user:reader
및 user:maintainer
라는 두 개의 역할에 해당한다고 가정해 보겠습니다.
1. Logto 에서 Hasura API 자원 생성하기
Logto 에서 Hasura API 자원을 생성합니다.
2. Logto 에서 Hasura 설정에 따른 역할 생성하기
1 단계에서 언급한 Hasura API 자원에 대해 read:user
와 maintain:user
라는 두 개의 scope
을 생성해야 하며, 그런 다음 read:user
scope 를 포함하는 user:reader
역할과 maintain:user
scope 를 포함하는 user:maintainer
역할을 생성 하여 Hasura 의 역할과 일대일로 대응시킵니다. 이러한 역할을 Logto 사용자에게 필요한 대로 할당해 줍니다.
3. JWT 모드를 활성화하기 위한 Hasura 환경 변수 HASURA_GRAPHQL_JWT_SECRET
구성하기
Hasura JWT 구성 옵션 을 참조하여 JWT 를 사용한 접근 제어를 사용하기 위해서는 환경 변수 HASURA_GRAPHQL_JWT_SECRET
를 추가하고 구성해야 합니다.
구성할 수 있는 다양한 옵션들이 있지만, 여기서는 가장 간단한 경우를 소개하겠습니다: jwk_url
만 구성하면 됩니다. 이 값은 Logto 의 OpenID 구성 엔드포인트(https://your.logto.domain/oidc/.well-known/openid-configuration)에서 얻을 수 있습니다.
4. 사용자 액세스 토큰의 추가 클레임 사용자 지정하기
Logto 의 커스텀 JWT 기능을 사용하여, JWT 형식의 사용자 액세스 토큰에 추가 클레임을 추가하는 로직을 사용자 정의합니다.
getCustomJwtClaims
메서드를 사용자 정의하여 Hasura 가 접근 제어를 구현하기 위해 의존하는 JWT 에 데이터를 추가합니다. 여기에는 인증된 시점의 사용자와 관련된 데이터, 그들이 보유한 role
들이 포함될 수 있으며, 이는 context
를 통해 접근할 수 있습니다.
하드코딩을 피하기 위해 환경 변수 USER_DEFAULT_ROLE_NAMES
를 정의했습니다.
5. Logto SDK 통합하기
Logto 와 Hasura 를 구성한 후, Logto SDK 를 앱에 통합합니다. 여기에서는 사용자가 로그인한 후 Logto 에서 발행된 사용자 액세스 토큰을 미리보기 위해 Next 예제를 사용합니다.
먼저, 이전에 생성한 user:reader
와 user:maintainer
역할을 사용자에게 할당한 후 해당 사용자로 로그인합니다.
사용자 액세스 토큰을 얻고 Hasura API 에 요청을 보냅니다:
결론
이 글에서는 Webhook 이 아닌 Hasura 가 지원하는 또 다른 방법인 JWT 기반 접근 제어 방법을 제공했습니다.
Hasura 의 Webhook 및 JWT 접근 제어 프로세스를 비교해 보면, Webhook 접근 방식은 Hasura 의 모든 요청마다 Webhook 을 Logto 에 보내고 응답을 기다리지만, JWT 기반 접근 방식은 JWT 가 만료될 때까지 계속 사용할 수 있습니다.
JWT 접근 방식은 네트워크 부하를 줄이고 Webhook 이 가져오는 네트워크 지연을 제거할 수 있습니다. 한편, Webhook 접근 방식은 사용자 권한의 변경 사항을 실시간으로 동기화할 수 있습니다.
사용자는 이러한 결론을 토대로, 실제 비즈니스 요구에 맞는 적절한 접근 방식을 선택할 수 있습니다.