• hasura
  • restful api
  • graphql
  • logto
  • custom jwt
  • access control
  • authorization

Logto x Hasura: JWT 를 사용한 접근 제어

이 종합 가이드는 Logto 와 Hasura 의 JWT 모드 접근 제어를 통합하는 데 필요한 단계를 설명하여 데이터 보안을 효과적으로 강화하는 방법을 다룹니다.

Darcy Ye
Darcy Ye
Developer

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 /userPATCH /user 두 가지 API 를 가지고 있으며, 각각 user:readeruser:maintainer 라는 두 개의 역할에 해당한다고 가정해 보겠습니다.

1. Logto 에서 Hasura API 자원 생성하기

Logto 에서 Hasura API 자원을 생성합니다.

Hasura API

2. Logto 에서 Hasura 설정에 따른 역할 생성하기

1 단계에서 언급한 Hasura API 자원에 대해 read:usermaintain:user 라는 두 개의 scope 을 생성해야 하며, 그런 다음 read:user scope 를 포함하는 user:reader 역할과 maintain:user scope 를 포함하는 user:maintainer 역할을 생성하여 Hasura 의 역할과 일대일로 대응시킵니다. 이러한 역할을 Logto 사용자에게 필요한 대로 할당해 줍니다.

Hasura API with scopes

User reader role

User maintainer role

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)에서 얻을 수 있습니다.

Hasura JWT config

4. 사용자 액세스 토큰의 추가 클레임 사용자 지정하기

Logto 의 커스텀 JWT 기능을 사용하여, JWT 형식의 사용자 액세스 토큰에 추가 클레임을 추가하는 로직을 사용자 정의합니다.

User access token script

getCustomJwtClaims 메서드를 사용자 정의하여 Hasura 가 접근 제어를 구현하기 위해 의존하는 JWT 에 데이터를 추가합니다. 여기에는 인증된 시점의 사용자와 관련된 데이터, 그들이 보유한 role 들이 포함될 수 있으며, 이는 context 를 통해 접근할 수 있습니다.

하드코딩을 피하기 위해 환경 변수 USER_DEFAULT_ROLE_NAMES 를 정의했습니다.

5. Logto SDK 통합하기

Logto 와 Hasura 를 구성한 후, Logto SDK 를 앱에 통합합니다. 여기에서는 사용자가 로그인한 후 Logto 에서 발행된 사용자 액세스 토큰을 미리보기 위해 Next 예제를 사용합니다.

User with roles

먼저, 이전에 생성한 user:readeruser:maintainer 역할을 사용자에게 할당한 후 해당 사용자로 로그인합니다.

사용자 액세스 토큰을 얻고 Hasura API 에 요청을 보냅니다:

결론

이 글에서는 Webhook 이 아닌 Hasura 가 지원하는 또 다른 방법인 JWT 기반 접근 제어 방법을 제공했습니다.

Hasura 의 WebhookJWT 접근 제어 프로세스를 비교해 보면, Webhook 접근 방식은 Hasura 의 모든 요청마다 Webhook 을 Logto 에 보내고 응답을 기다리지만, JWT 기반 접근 방식은 JWT 가 만료될 때까지 계속 사용할 수 있습니다.

JWT 접근 방식은 네트워크 부하를 줄이고 Webhook 이 가져오는 네트워크 지연을 제거할 수 있습니다. 한편, Webhook 접근 방식은 사용자 권한의 변경 사항을 실시간으로 동기화할 수 있습니다.

사용자는 이러한 결론을 토대로, 실제 비즈니스 요구에 맞는 적절한 접근 방식을 선택할 수 있습니다.