티스토리 뷰
Laravel에서 소셜 로그인을 붙일 때 쓰는 공식 패키지가 Socialite다. 문제는 공식이 지원하는 곳이 제한적이라는 것이다.
공식 지원 목록은 이렇다. Facebook, X(Twitter), LinkedIn, Google, GitHub, GitLab, Bitbucket, Slack. 국내 서비스에서 정작 필요한 카카오, 네이버는 없다.
Socialite Providers
이걸 해결해주는 커뮤니티 프로젝트가 있다.
https://socialiteproviders.com/about/
카카오, 네이버를 포함해 수백 개의 프로바이더가 등록돼 있다. 사용법은 전부 동일한 패턴이라 하나만 익히면 나머지는 문서만 보고 붙일 수 있다.
설치와 설정 (카카오 예시)
1. 패키지 설치
composer require socialiteproviders/kakao
2. 이벤트 리스너 등록
Socialite Providers는 이벤트 방식으로 프로바이더를 주입한다. Laravel 11 이상이라면 AppServiceProvider에서 바로 등록할 수 있다.
// app/Providers/AppServiceProvider.php
use Illuminate\Support\Facades\Event;
use SocialiteProviders\Manager\SocialiteWasCalled;
public function boot(): void
{
Event::listen(function (SocialiteWasCalled $event) {
$event->extendSocialite('kakao', \SocialiteProviders\Kakao\Provider::class);
});
}
Laravel 10 이하는 EventServiceProvider의 $listen 배열에 등록한다.
3. config/services.php
'kakao' => [
'client_id' => env('KAKAO_CLIENT_ID'),
'client_secret' => env('KAKAO_CLIENT_SECRET'),
'redirect' => env('KAKAO_REDIRECT_URI'),
],
4. 라우트와 컨트롤러
Route::get('/auth/kakao', [SocialController::class, 'redirect']);
Route::get('/auth/kakao/callback', [SocialController::class, 'callback']);
// 컨트롤러
public function redirect()
{
return Socialite::driver('kakao')->redirect();
}
public function callback()
{
$social = Socialite::driver('kakao')->user();
$user = User::updateOrCreate(
['provider' => 'kakao', 'provider_id' => $social->getId()],
[
'name' => $social->getName() ?? '회원',
'email' => $social->getEmail(),
]
);
Auth::login($user, true);
return redirect('/');
}
국내 서비스에서 자주 걸리는 지점
이메일이 안 넘어온다
카카오는 이메일이 선택 동의 항목이다. 사용자가 동의하지 않으면 getEmail()이 null이다. 카카오 개발자 콘솔에서 이메일 수집 권한을 신청해야 하고, 그마저도 사업자 검수가 필요한 경우가 있다.
그래서 users 테이블의 email을 NOT NULL UNIQUE로 잡아두면 여기서 터진다. 소셜 로그인을 쓸 거라면 처음부터 nullable로 설계하는 게 낫다.
$table->string('email')->nullable();
$table->string('provider');
$table->string('provider_id');
$table->unique(['provider', 'provider_id']);
식별자는 이메일이 아니라 provider + provider_id 조합으로 잡는다. 같은 사람이 카카오와 네이버로 각각 가입할 수 있다는 것도 고려해야 한다.
Redirect URI가 정확히 일치해야 한다
카카오·네이버 콘솔에 등록한 URI와 .env 값이 완전히 같아야 한다. 끝의 슬래시 하나, http/https 차이로도 실패한다. 로컬·스테이징·운영 URI를 각각 등록해두면 편하다.
네이버는 이름 필드가 다르다
프로바이더마다 반환하는 필드가 다르다. $social->user 로 원본 응답 배열을 그대로 확인할 수 있으니, 붙일 때 한 번 찍어보고 매핑하는 게 확실하다.
dd($social->user); // 원본 응답 전체
보안: state 검증
Socialite는 CSRF 방지를 위해 state 파라미터를 세션에 저장하고 콜백에서 검증한다. API 서버처럼 세션이 없는 환경에서는 이 검증이 실패한다.
// 세션이 없는 환경 (권장하지 않음, 대신 PKCE 등 다른 방어 필요)
Socialite::driver('kakao')->stateless()->user();
stateless()는 편하지만 CSRF 방어를 포기하는 것이다. SPA + API 구조라면 프런트에서 별도로 state를 관리하거나 PKCE를 적용하는 편이 안전하다.
정리
- Socialite 공식 지원에는 카카오·네이버가 없다
- socialiteproviders.com 에서 커뮤니티 프로바이더를 찾는다
- 패키지 설치 → 이벤트 리스너 등록 → services.php → 라우트, 이 4단계가 전부다
- 카카오 이메일은 선택 동의다.
email은 nullable로 설계할 것 - 식별자는 이메일이 아니라
provider + provider_id - Redirect URI는 슬래시 하나까지 정확히 일치해야 한다
'개발 > Laravel' 카테고리의 다른 글
| Laravel paginate에서 값이 매번 달라진 이유, ORDER BY가 없었다 (0) | 2024.05.13 |
|---|---|
| 프로젝트별로 php version 자동 관리하기 (feat: php monitor) (0) | 2023.03.24 |
| Laravel로 블로그 직접 만들기 (2018년 기록) (0) | 2018.08.27 |
| Laravel 유효성 검사 실패 시 입력창 테두리 강조하기 (0) | 2018.08.27 |
| Laravel 한글 언어팩 적용하기, 유효성 검사 메시지 한글화 (2) | 2018.08.27 |
