아폴로(Apollo)는 GraphQL을 사용하는 개발자들에게 매우 인기 있는 서버 플랫폼입니다. 아폴로 서버를 사용하면 클라이언트 애플리케이션과 서버 간의 원활한 데이터 통신을 지원할 수 있습니다. 이번 포스트에서는 아폴로 서버를 사용하여 서드파티 인증을 구현하는 방법에 대해 알아보겠습니다.
1. 인증 과정 이해하기
서드파티 인증을 구현하기 전에, 인증 과정을 이해하는 것이 중요합니다. 일반적으로, 서드파티 인증은 아래의 단계로 이루어집니다.
- 사용자가 클라이언트 애플리케이션에 로그인 요청을 보냅니다.
- 클라이언트 애플리케이션은 서드파티 인증 공급자에게 사용자를 리디렉션합니다.
- 사용자는 인증 공급자 웹 사이트에서 로그인 정보를 입력하고 승인합니다.
- 서드파티 인증 공급자는 사용자를 리디렉션하여 인증 코드를 제공합니다.
- 클라이언트 애플리케이션은 인증 코드를 받고 아폴로 서버에 전달합니다.
- 아폴로 서버는 인증 코드를 사용하여 사용자의 액세스 토큰을 요청합니다.
- 아폴로 서버는 액세스 토큰을 받아 사용자의 인증 정보를 확인합니다.
- 사용자의 세션을 유지하기 위해 아폴로 서버는 사용자 정보를 세션에 저장합니다.
2. 아폴로 서버에 서드파티 인증 구현하기
아폴로 서버에 서드파티 인증을 구현하기 위해 아래의 단계를 따라 진행할 수 있습니다.
스키마 정의하기
먼저, 아폴로 서버의 스키마에 사용자 정보를 포함하여 정의해야 합니다. 사용자 정보에는 사용자 ID, 이름, 이메일 등이 포함될 수 있습니다.
type User {
id: ID!
name: String!
email: String!
}
type Query {
me: User
}
로그인 요청 처리하기
클라이언트 애플리케이션에서 로그인 요청을 받으면, 아폴로 서버는 서드파티 인증 공급자에게 사용자를 리디렉션해야 합니다. 이때, 인증 공급자의 로그인 페이지 URL과 클라이언트의 리디렉션 URL을 설정해야 합니다.
// 로그인 요청 처리
app.get('/login', (req, res) => {
const { provider } = req.query;
const redirectURL = 'https://auth-provider.com/login';
const clientRedirectURL = 'https://client-app.com/callback';
// 인증 공급자에게 사용자 리디렉션 요청
res.redirect(`${redirectURL}?redirect_uri=${clientRedirectURL}`);
});
콜백 처리하기
인증 공급자가 사용자 인증을 완료하고 클라이언트를 리디렉션할 때, 아폴로 서버는 콜백을 처리하고 인증 코드를 얻어와야 합니다.
// 콜백 처리
app.get('/callback', (req, res) => {
const { code } = req.query;
// 아폴로 서버로 인증 코드 전송
res.redirect(`https://apollo-server.com/callback?code=${code}`);
});
토큰 요청하기
아폴로 서버는 인증 코드를 사용하여 서드파티 액세스 토큰을 요청해야 합니다. 이때, 클라이언트 ID, 클라이언트 시크릿, 리디렉션 URL 등의 정보가 필요합니다.
// 토큰 요청
app.get('/callback', (req, res) => {
const { code } = req.query;
const clientID = 'your-client-id';
const clientSecret = 'your-client-secret';
const redirectURL = 'https://apollo-server.com/callback';
// 액세스 토큰 요청
const tokenURL = 'https://auth-provider.com/token';
axios.post(tokenURL, {
code,
client_id: clientID,
client_secret: clientSecret,
redirect_uri: redirectURL,
grant_type: 'authorization_code'
}).then(response => {
const accessToken = response.data.access_token;
// 아폴로 서버로 액세스 토큰 전송
res.redirect(`https://apollo-server.com/callback?access_token=${accessToken}`);
}).catch(error => {
console.error(error);
res.status(500).json({ error: 'Failed to request access token' });
});
});
사용자 정보 확인하기
아폴로 서버는 액세스 토큰을 사용하여 인증 공급자에게 사용자 정보를 확인할 수 있습니다. 이때, 인증 공급자의 사용자 정보 API 엔드포인트를 호출해야 합니다.
// 사용자 정보 요청
app.get('/callback', (req, res) => {
const { accessToken } = req.query;
const userInfoURL = 'https://auth-provider.com/userinfo';
// 사용자 정보 요청
axios.get(userInfoURL, {
headers: {
Authorization: `Bearer ${accessToken}`
}
}).then(response => {
const { id, name, email } = response.data;
// 아폴로 서버에 사용자 정보 저장
req.session.user = { id, name, email };
res.redirect('/home'); // 사용자를 홈 화면으로 리디렉션
}).catch(error => {
console.error(error);
res.status(500).json({ error: 'Failed to fetch user information' });
});
});
사용자 인증 정보 조회하기
사용자가 인증된 상태인지 확인하기 위해 아폴로 서버의 쿼리에서 현재 사용자 정보를 조회할 수 있습니다.
// 현재 사용자 정보 조회
const resolvers = {
Query: {
me: (_, __, { req }) => req.session.user
}
};
결론
이제까지 아폴로 서버를 사용하여 서드파티 인증을 구현하는 방법에 대해 알아보았습니다. 서드파티 인증은 사용자 인증을 보다 안전하고 편리하게 처리할 수 있는 방법입니다. 아폴로 서버를 사용하면 이러한 인증 과정을 비교적 간편하게 구현할 수 있습니다.