[swift] 아폴로 서버를 사용한 서드파티 인증 구현 방법

아폴로(Apollo)는 GraphQL을 사용하는 개발자들에게 매우 인기 있는 서버 플랫폼입니다. 아폴로 서버를 사용하면 클라이언트 애플리케이션과 서버 간의 원활한 데이터 통신을 지원할 수 있습니다. 이번 포스트에서는 아폴로 서버를 사용하여 서드파티 인증을 구현하는 방법에 대해 알아보겠습니다.

1. 인증 과정 이해하기

서드파티 인증을 구현하기 전에, 인증 과정을 이해하는 것이 중요합니다. 일반적으로, 서드파티 인증은 아래의 단계로 이루어집니다.

  1. 사용자가 클라이언트 애플리케이션에 로그인 요청을 보냅니다.
  2. 클라이언트 애플리케이션은 서드파티 인증 공급자에게 사용자를 리디렉션합니다.
  3. 사용자는 인증 공급자 웹 사이트에서 로그인 정보를 입력하고 승인합니다.
  4. 서드파티 인증 공급자는 사용자를 리디렉션하여 인증 코드를 제공합니다.
  5. 클라이언트 애플리케이션은 인증 코드를 받고 아폴로 서버에 전달합니다.
  6. 아폴로 서버는 인증 코드를 사용하여 사용자의 액세스 토큰을 요청합니다.
  7. 아폴로 서버는 액세스 토큰을 받아 사용자의 인증 정보를 확인합니다.
  8. 사용자의 세션을 유지하기 위해 아폴로 서버는 사용자 정보를 세션에 저장합니다.

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
  }
};

결론

이제까지 아폴로 서버를 사용하여 서드파티 인증을 구현하는 방법에 대해 알아보았습니다. 서드파티 인증은 사용자 인증을 보다 안전하고 편리하게 처리할 수 있는 방법입니다. 아폴로 서버를 사용하면 이러한 인증 과정을 비교적 간편하게 구현할 수 있습니다.