자바스크립트를 활용한 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 #인증