[typescript] GraphQL-js에서의 타입 기반 인증 및 권한 제어 방법

GraphQL은 클라이언트가 필요로 하는 데이터를 효율적으로 요청하고 응답받을 수 있는 쿼리 언어 및 런타임입니다. GraphQL 서버는 각각의 필드에 대한 액세스 권한을 효율적으로 제어하기 위해 타입 기반의 인증과 권한 제어가 필요합니다. 이 기사에서는 TypeScript로 작성된 GraphQL-js 서버에서 타입 기반의 인증과 권한 제어를 구현하는 방법에 대해 살펴보겠습니다.

1. 사용자 정의 타입과 권한 검사

GraphQL-js에서는 타입이나 필드에 대한 권한을 검사하는 방법을 사용자가 직접 정의할 수 있습니다. 예를 들어, 사용자가 요청한 쿼리에 따라 사용자 정의 타입을 생성하고 해당 타입에 필요한 권한을 검사하는 함수를 작성할 수 있습니다.

import { rule, shield, and, or, not } from 'graphql-shield';

const isAuthenticated = rule()(async (parent, args, ctx, info) => {
  return ctx.user !== null;
});

const isAdmin = rule()(async (parent, args, ctx, info) => {
  return ctx.user.role === 'admin';
});

export const permissions = shield({
  Query: {
    authorizedQuery: isAuthenticated,
    adminQuery: and(isAuthenticated, isAdmin),
  },
});

위 예제에서는 isAuthenticatedisAdmin 함수를 사용하여 각각 사용자가 인증되었는지, 그리고 관리자인지를 검사하고 있습니다. 그리고 shield 함수를 사용하여 각 쿼리에 대한 권한을 지정하고 있습니다.

2. 컨텍스트를 활용한 권한 검사

GraphQL-js에서는 요청을 처리하는 동안에만 유효한 컨텍스트를 활용하여 권한을 검사할 수 있습니다. 이를 활용하여 사용자의 인증 정보나 권한 정보를 쉽게 접근하고 활용할 수 있습니다.

import { applyMiddleware } from 'graphql-middleware';

const permissionsMiddleware = async (resolve, parent, args, ctx, info) => {
  if (info.operation.operation === 'query' && info.operation.name.value === 'adminQuery') {
    if (!ctx.user || ctx.user.role !== 'admin') {
      throw new Error('Unauthorized');
    }
  }
  return resolve(parent, args, ctx, info);
};

const schemaWithMiddleware = applyMiddleware(schema, permissionsMiddleware);

위 예제에서는 graphql-middleware 패키지를 사용하여 미들웨어를 정의하고, 해당 미들웨어에서 컨텍스트를 활용하여 특정 쿼리에 대한 권한을 검사하고 있습니다.

결론

GraphQL-js에서 타입 기반의 인증과 권한 제어를 구현하는 방법에 대해 알아보았습니다. 사용자 정의 타입과 권한 검사, 그리고 컨텍스트를 활용한 권한 검사를 통해 GraphQL 서버에서 쉽게 권한을 관리할 수 있습니다. 이를 통해 보안적인 측면에서도 안전한 GraphQL 서버를 구축할 수 있습니다.

참고문헌: