GraphQL은 REST API의 대안으로 떠오르면서 다양한 기능을 제공하고 있습니다. 특히 인증 및 권한 관리에 있어 매우 유용한 도구로 자리 잡고 있습니다. 이번 글에서는 GraphQL을 활용하여 인증 및 권한 관리를 보다 원활하게 할 수 있는 도구 5가지를 소개하겠습니다.

1. Apollo Server

Apollo Server는 GraphQL API를 구축하기 위한 강력한 도구입니다. 인증을 위한 미들웨어를 쉽게 추가할 수 있어 필요한 정보를 요청하기 전에 사용자 인증을 처리할 수 있습니다. 아래는 JWT(JSON Web Token)를 이용한 간단한 인증 예제입니다.

const { ApolloServer } = require('apollo-server');
const jwt = require('jsonwebtoken');

const typeDefs = 
  type Query {
    me: User
  }
  type User {
    id: ID!
    username: String!
  }
;

const resolvers = {
  Query: {
    me: (parent, args, context) => {
      if (!context.user) {
        throw new AuthenticationError('You must be logged in');
      }
      return context.user;
    },
  },
};

const server = new ApolloServer({
  typeDefs,
  resolvers,
  context: ({ req }) => {
    const token = req.headers.authorization || '';
    try {
      const user = jwt.verify(token, 'YOUR_SECRET_KEY');
      return { user };
    } catch (e) {
      return { user: null };
    }
  },
});

server.listen().then(({ url }) => {
  console.log(🚀  Server ready at ${url});
});

2. Hasura

Hasura는 GraphQL API를 자동으로 생성해주는 엔진으로, 권한 관리를 내장하고 있습니다. Hasura의 권한 시스템은 세밀한 접근 제어를 제공하며, 사용자의 역할을 기반으로 데이터 접근을 관리할 수 있습니다. Hasura의 설정 파일을 통해 권한을 손쉽게 관리할 수 있습니다.

{
  "version": 3,
  "tables": [
    {
      "table": "users",
      "select": {
        "role": "user",
        "permissions": {
          "allow": true,
          "filters": {
            "id": {
              "_eq": "X-Hasura-User-Id"
            }
          }
        }
      }
    }
  ]
}

3. Auth0

Auth0는 인증 솔루션으로, GraphQL API와 연동하여 손쉽게 인증을 구현할 수 있습니다. Auth0를 사용하면 다양한 소셜 로그인 및 사용자 관리 기능을 활용할 수 있습니다. 다음은 Auth0와의 연동 예제입니다.

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

const context = async ({ req }) => {
  const token = req.headers.authorization || '';
  const user = await auth0.checkJwt(token);
  if (!user) {
    throw new AuthenticationError('You must be logged in');
  }
  return { user };
};

4. Firebase Authentication

Firebase Authentication은 다양한 인증 방법을 제공하며, GraphQL API와 쉽게 통합할 수 있습니다. Firebase SDK를 사용하여 사용자를 인증하고, 해당 정보를 GraphQL 컨텍스트에 포함시킬 수 있습니다.

const admin = require('firebase-admin');

const context = async ({ req }) => {
  const token = req.headers.authorization || '';
  const decodedToken = await admin.auth().verifyIdToken(token);
  return { user: decodedToken };
};

5. Passport.js

Passport.js는 Node.js를 위한 유연한 인증 미들웨어로, 여러 전략을 지원합니다. GraphQL과 함께 사용하면 인증 프로세스를 간단하게 처리할 수 있습니다. 다음은 Passport.js를 GraphQL과 통합하는 예제입니다.

const passport = require('passport');
const { Strategy } = require('passport-local');

passport.use(new Strategy((username, password, done) => {
  // 사용자 인증 로직
}));

app.post('/login', passport.authenticate('local'), (req, res) => {
  res.send('Logged In');
});

마무리

GraphQL을 활용한 인증 및 권한 관리 도구들은 각각의 장점과 특성을 가지고 있어, 개발자의 필요에 따라 선택하여 사용할 수 있습니다. Apollo Server, Hasura, Auth0, Firebase Authentication, 그리고 Passport.js는 다양한 인증 요구사항을 충족시키며, 개발자가 보다 안전하고 효율적인 API를 구축하는 데 도움을 줍니다. 이들 도구를 적절히 활용하여 인증 및 권한 관리를 한층 더 강화해 보시기 바랍니다.