PHP

PHP로 소셜 로그인 구현하기

thebasics 2024. 10. 4. 10:00

목차
1. OAuth 2.0 개념
   - OAuth 2.0이란 무엇인가?
   - OAuth 2.0의 흐름
   - 소셜 로그인에서 OAuth 2.0의 역할
2. 소셜 로그인 구현
   - Google 로그인 구현
   - Facebook 로그인 구현
   - GitHub 로그인 구현
3. 코드 예제
4. 결론 및 추가 학습 자료


1. OAuth 2.0 개념

OAuth 2.0이란 무엇인가?

OAuth 2.0은 안전한 리소스 액세스를 위해 개발된 업계 표준 프로토콜입니다. OAuth 2.0을 사용하면 애플리케이션은 사용자의 자격 증명을 저장하지 않고도 타사 서비스의 API에 접근할 수 있습니다. 이를 통해 사용자 정보, 이메일, 프로필 데이터 등 다양한 자원을 안전하게 활용할 수 있습니다.

OAuth 2.0의 흐름

1. 클라이언트 애플리케이션: 사용자를 대신해 자원 서버에 접근하려는 애플리케이션입니다.
2. 자원 소유자(사용자 자신의 자원을 클라이언트 애플리케이션이 접근할 수 있도록 허용하는 사용자입니다.
3. 권한 부여 서버: 자원 소유자가 클라이언트 애플리케이션에 대한 접근 권한을 부여하는 서버입니다.
4. 자원 서버: 사용자 데이터를 저장하고 있으며, 클라이언트 애플리케이션이 접근하려는 서버입니다.

OAuth 2.0은 다음과 같은 단계로 동작합니다:
- 인증 요청: 클라이언트 애플리케이션은 사용자가 권한을 부여할 수 있는 페이지로 리디렉션합니다.
- 사용자 승인: 사용자는 권한 부여 서버에서 로그인하고, 클라이언트 애플리케이션이 자원 서버에 접근할 수 있도록 승인합니다.
- 접근 토큰 발급: 클라이언트 애플리케이션은 권한 부여 서버로부터 접근 토큰을 수신합니다.
- 자원 접근: 클라이언트 애플리케이션은 이 접근 토큰을 사용해 자원 서버에서 데이터를 요청하고, 사용자 정보를 받아옵니다.

소셜 로그인에서 OAuth 2.0의 역할

소셜 로그인은 사용자가 특정 서비스에 별도의 계정을 만들 필요 없이, 기존의 소셜 미디어 계정을 통해 로그인할 수 있게 합니다. OAuth 2.0은 이러한 소셜 로그인을 가능하게 하는 핵심 프로토콜로, 사용자의 소셜 미디어 계정 정보를 안전하게 액세스할 수 있도록 합니다.


2. 소셜 로그인 구현

Google 로그인 구현

Google 로그인을 구현하기 위해서는 Google API 콘솔에서 클라이언트 ID와 클라이언트 시크릿을 생성해야 합니다.

1. Google API 콘솔에서 프로젝트 생성:
   - [Google API 콘솔](https://console.developers.google.com/)에 접속하여 프로젝트를 생성합니다.
   - 'OAuth 2.0 클라이언트 ID'를 생성하고, 리디렉션 URI를 설정합니다.

2. PHP로 Google 로그인 구현:

// google-login.php
require_once 'vendor/autoload.php';

$client = new Google_Client();
$client->setClientId('YOUR_CLIENT_ID');
$client->setClientSecret('YOUR_CLIENT_SECRET');
$client->setRedirectUri('http://localhost/google-callback.php');
$client->addScope('email');
$client->addScope('profile');

if (!isset($_GET['code'])) {
    $authUrl = $client->createAuthUrl();
    header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL));
} else {
    $client->authenticate($_GET['code']);
    $_SESSION['access_token'] = $client->getAccessToken();
    header('Location: http://localhost/google-callback.php');
    exit();
}

3. Google 콜백 처리:

// google-callback.php
require_once 'vendor/autoload.php';

$client = new Google_Client();
$client->setClientId('YOUR_CLIENT_ID');
$client->setClientSecret('YOUR_CLIENT_SECRET');
$client->setRedirectUri('http://localhost/google-callback.php');
$client->addScope('email');
$client->addScope('profile');

if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
    $client->setAccessToken($_SESSION['access_token']);
    $google_oauth = new Google_Service_Oauth2($client);
    $google_account_info = $google_oauth->userinfo->get();
    $email = $google_account_info->email;
    $name = $google_account_info->name;
    echo "User Email: $email<br>";
    echo "User Name: $name";
} else {
    echo "No session available.";
}

Facebook 로그인 구현

Facebook 로그인을 구현하기 위해서는 Facebook 개발자 콘솔에서 앱을 생성하고, OAuth 설정을 해야 합니다.

1. Facebook 개발자 콘솔에서 앱 생성:
   - [Facebook 개발자 콘솔](https://developers.facebook.com/)에 접속하여 새로운 앱을 생성합니다.
   - Facebook 로그인 제품을 추가하고, 리디렉션 URI를 설정합니다.

2. PHP로 Facebook 로그인 구현:

// facebook-login.php
require_once 'vendor/autoload.php';

$fb = new \Facebook\Facebook([
  'app_id' => 'YOUR_APP_ID',
  'app_secret' => 'YOUR_APP_SECRET',
  'default_graph_version' => 'v10.0',
]);

$helper = $fb->getRedirectLoginHelper();
$permissions = ['email']; 
$loginUrl = $helper->getLoginUrl('http://localhost/facebook-callback.php', $permissions);

header('Location: ' . $loginUrl);
exit();

3. Facebook 콜백 처리:

// facebook-callback.php
require_once 'vendor/autoload.php';

$fb = new \Facebook\Facebook([
  'app_id' => 'YOUR_APP_ID',
  'app_secret' => 'YOUR_APP_SECRET',
  'default_graph_version' => 'v10.0',
]);

$helper = $fb->getRedirectLoginHelper();

try {
    $accessToken = $helper->getAccessToken();
    if (!isset($accessToken)) {
        echo "Access Token Error";
        exit;
    }
    $response = $fb->get('/me?fields=id,name,email', $accessToken);
    $user = $response->getGraphUser();
    echo 'Name: ' . $user['name'];
    echo 'Email: ' . $user['email'];
} catch(Facebook\Exceptions\FacebookResponseException $e) {
    echo 'Graph returned an error: ' . $e->getMessage();
} catch(Facebook\Exceptions\FacebookSDKException $e) {
    echo 'Facebook SDK returned an error: ' . $e->getMessage();
}

3. 코드 예제

다음은 소셜 로그인을 구현하는 PHP 코드를 종합적으로 정리한 예제입니다. 이 예제는 Google, Facebook, GitHub에서 소셜 로그인을 구현하여, 사용자 정보를 받아오는 과정을 보여줍니다.

Google 로그인:

// google-login.php
require_once 'vendor/autoload.php';

$client = new Google_Client();
$client->setClientId('YOUR_CLIENT_ID');
$client->setClientSecret('YOUR_CLIENT_SECRET');
$client->setRedirectUri('http://localhost/google-callback.php');
$client->addScope('email');
$client->addScope('profile');

if (!isset($_GET['code'])) {
    $authUrl = $client->createAuthUrl();
    header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL));
} else {
    $client->authenticate($_GET['code']);
    $_SESSION['access_token'] = $client->getAccessToken();
    header('Location: http://localhost/google-callback.php');
    exit();
}

Facebook 로그인:

// facebook-login.php
require_once 'vendor/autoload.php';

$fb = new \Facebook\Facebook([
  'app_id' => 'YOUR_APP_ID',
  'app_secret' => 'YOUR_APP_SECRET',
  'default_graph_version' => 'v10.0',
]);

$helper = $fb->getRedirectLoginHelper();
$permissions = ['email']; 
$loginUrl = $helper->getLoginUrl('http://localhost/facebook-callback.php', $permissions);

header('Location: ' . $loginUrl);
exit();

콜백 처리:
각 플랫폼별로 OAuth 2.0의 콜백을 처리하여 사용자의 정보를 가져옵니다. 이 과정에서 클라이언트 ID, 시크릿, 코드 교환 등을 통해 인증이 이루어집니다.


4. 결론 및 추가 학습 자료

이번 글에서는 PHP로 소셜 로그인을 구현하는 방법에 대해 알아보았습니다. 소셜 로그인은 사용자가 별도의 계정을 생성할 필요 없이, 기존의 소셜 미디어 계정을 통해 애플리케이션에 로그인할 수 있는 편리한 방법을 제공합니다. OAuth 2.0을 사용하여 Google, Facebook로그인을 구현하고, 사용자의 프로필 정보를 안전하게 받아오는 방법을 배웠습니다.

추가 학습 자료:
- [OAuth 2.0 공식 문서](https://oauth.net/2/) OAuth 2.0 프로토콜에 대한 공식 가이드입니다.
- [Google API 콘솔](https://console.developers.google.com/) Google OAuth 2.0 클라이언트 설정을 위한 콘솔입니다.
- [Facebook for Developers](https://developers.facebook.com/) Facebook 로그인을 위한 개발자 리소스입니다.


이제 PHP로 다양한 소셜 로그인 기능을 구현하여, 사용자 친화적인 애플리케이션을 개발할 수 있습니다. 실습을 통해 OAuth 2.0의 강력한 기능을 익히고, 프로젝트에 적용해보세요!

반응형