[nodejs] GraphQL 요청의 인증과 권한 부여

GraphQL은 클라이언트가 필요한 데이터를 요청하는 유연하고 강력한 쿼리 언어입니다. 하지만 GraphQL을 사용할 때 인증과 권한 부여는 중요한 고려사항입니다. Node.js와 GraphQL을 함께 사용할 때의 인증과 권한 부여에 대해 알아봅시다.

1. JWT(JSON Web Token)를 사용한 사용자 인증

GraphQL API를 보호하기 위해 사용자를 인증하려면 보통 JWT(JSON Web Token)를 사용합니다. 첫 번째 단계는 사용자가 올바른 자격 증명(예: 이메일 및 비밀번호)을 제공했는지 확인하는 것입니다. 성공하면 서버는 사용자에 대한 JWT를 생성하여 반환합니다.

const jwt = require('jsonwebtoken');
const secretKey = 'mysecretkey';

function generateToken(user) {
  const payload = { userId: user.id, email: user.email };
  return jwt.sign(payload, secretKey, { expiresIn: '1h' });
}

function verifyToken(token) {
  return jwt.verify(token, secretKey);
}

2. GraphQL 미들웨어를 사용한 권한 부여

GraphQL 서버에서는 사용자의 요청이 허가된 작업인지 확인해야 합니다. 이를 위해 GraphQL 미들웨어를 사용하여 사용자의 권한을 검사할 수 있습니다.

const { ForbiddenError } = require('apollo-server-express');

function isAuthenticated(resolve, parent, args, context, info) {
  if (!context.user) {
    throw new ForbiddenError('Unauthorized');
  }
  return resolve(parent, args, context, info);
}

3. GraphQL 스키마 레벨의 권한 설정

GraphQL 스키마에서는 각 필드에 대한 접근 권한을 설정할 수 있습니다. 예를 들어, 특정 필드에 대한 접근을 관리자만 허용하도록 설정할 수 있습니다.

const { rule, and, or, not } = require('graphql-shield');

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

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

const permissions = {
  Query: {
    adminField: and(isAuthenticated, isAdmin),
    userField: isAuthenticated,
  },
};

GraphQL을 사용할 때, 사용자의 인증과 권한 부여는 핵심적인 부분입니다. 위에서 설명한 방법을 사용하여 Node.js로 GraphQL API를 안전하게 보호할 수 있습니다.

더 많은 자세한 내용은 GraphQL 공식 문서를 참조하세요.