자바스크립트를 활용한 GraphQL Subscriptions를 위한 인증 시스템 구현 방법

GraphQL Subscriptions는 실시간으로 데이터 변경을 수신하고 처리할 수 있는 기능을 제공합니다. 그러나 GraphQL Subscriptions를 보호하려면 인증 시스템을 구현해야합니다. 이를 위해 자바스크립트를 사용하여 GraphQL Subscriptions에 보안을 추가하는 방법을 알아보겠습니다.

1. JWT(JSON Web Token) 사용

JWT는 인증된 사용자를 식별하기 위한 방법 중 하나로 널리 사용됩니다. JWT는 몇 가지 정보를 포함하는 토큰입니다(예: 사용자 ID, 만료 시간, 권한 등). 자바스크립트를 사용하여 JWT를 생성, 검증 및 인코딩하는 것이 가능합니다.

const jwt = require('jsonwebtoken');
const secretKey = 'your-secret-key';

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

function verifyToken(token) {
  try {
    const decoded = jwt.verify(token, secretKey);
    return decoded;
  } catch (err) {
    throw new Error('Invalid token');
  }
}

2. GraphQL Subscription Resolver에서 인증 확인

GraphQL Subscription Resolver는 Subscription이 호출될 때 실행되는 함수입니다. 이 함수를 사용하여 JWT를 확인하여 사용자의 인증 상태를 확인할 수 있습니다.

const { withFilter } = require('graphql-subscriptions');

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

const pubsub = new PubSub();

const SOMETHING_CHANGED_TOPIC = 'something_changed';

const resolvers = {
  Subscription: {
    somethingChanged: {
      subscribe: withFilter(
        () => pubsub.asyncIterator(SOMETHING_CHANGED_TOPIC),
        (payload, args, context) => {
          // JWT 확인
          const { token } = context;
          const decodedToken = verifyToken(token);
          
          // 여기서 필요한 로직 추가
          
          return true;
        }
      ),
    },
  },
};

3. GraphQL Subscription 요청시 JWT 전달

GraphQL Subscription을 요청할 때 JWT를 전달해야합니다. 이를 위해 웹소켓 연결을 설정하는 부분에서 JWT를 헤더에 추가하는 로직을 추가해야합니다.

const wsLink = new WebSocketLink({
  uri: 'ws://example.com/graphql',
  options: {
    connectionParams: () => {
      const token = localStorage.getItem('token');
      return {
        token,
      };
    },
  },
});

결론

GraphQL Subscriptions에 대한 인증 시스템을 구현하는 방법을 살펴보았습니다. JWT를 사용하여 사용자의 인증 상태를 확인하고, Subscription Resolver에서 이를 검증하면서 보안을 보장할 수 있습니다. 이러한 방법을 활용하여 GraphQL Subscriptions를 안전하게 활용할 수 있습니다.

#graphql #인증