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를 구축하는 데 도움을 줍니다. 이들 도구를 적절히 활용하여 인증 및 권한 관리를 한층 더 강화해 보시기 바랍니다.