본문 바로가기
스프링/SpringSecurity

[실전] Spring Security + OAuth2 소셜 로그인(구글, 카카오) & JWT 연동 마스터

by 공부 안하고 싶은 사람 2026. 3. 18.
반응형
Backend Security Series 03

클릭 한 번으로 로그인,
OAuth2 & JWT 통합 아키텍처

 

안녕하세요, code-resting입니다. 보안 시리즈의 마지막 대미는 소셜 로그인(OAuth2)입니다. 단순히 구글이나 카카오 로그인을 구현하는 것을 넘어, 인증 성공 시 우리가 어제 만든 JWT 토큰을 클라이언트에게 어떻게 안전하게 전달하는지 그 전체 흐름을 완성해 보겠습니다.

1. OAuth 2.0 권한 부여 승인 코드 방식

우리가 구현할 방식은 보안상 가장 권장되는 Authorization Code Grant 방식입니다.

  • 안전한 데이터 이동: 사용자의 비밀번호가 우리 서버로 전달되지 않습니다.
  • 인증 대행: 신뢰할 수 있는 대형 플랫폼(Google, Kakao)에 인증 책임을 맡깁니다.

2. 핵심 클래스: CustomOAuth2UserService

로그인 성공 시 외부 플랫폼(Google 등)에서 가져온 유저 정보를 우리 DB에 저장하거나 업데이트하는 로직을 담당합니다.

@Service
public class CustomOAuth2UserService extends DefaultOAuth2UserService {
    @Override
    public OAuth2User loadUser(OAuth2UserRequest userRequest) {
        OAuth2User oAuth2User = super.loadUser(userRequest);
        
        // 플랫폼 식별 (google, kakao 등)
        String provider = userRequest.getClientRegistration().getRegistrationId();
        // 유저 정보 커스텀 파싱 및 DB 저장 로직
        User user = saveOrUpdate(oAuth2User, provider);
        
        return new CustomUserDetails(user, oAuth2User.getAttributes());
    }
}

3. 인증 성공 후 JWT 발급 (SuccessHandler)

소셜 인증이 완료되면 onAuthenticationSuccess 핸들러가 실행됩니다. 여기서 JWT를 생성하여 클라이언트에게 리다이렉트 시 쿼리 파라미터나 쿠키로 전달합니다.

@Component
public class OAuth2SuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
    @Override
    public void onAuthenticationSuccess(...) {
        // 1. 로그인 유저 정보 꺼내기
        OAuth2User oAuth2User = (OAuth2User) auth.getPrincipal();
        // 2. JWT 토큰 생성
        String accessToken = jwtProvider.createAccessToken(oAuth2User);
        // 3. 프론트엔드 특정 페이지로 리다이렉트 (토큰 포함)
        getRedirectStrategy().sendRedirect(request, response, "https://client.com/oauth/callback?token=" + accessToken);
    }
}

💡 시리즈 마무리: 통합 보안 아키텍처

이로써 [자체 회원가입/로그인 + 소셜 로그인]을 모두 수용하면서, 모든 인증 결과로 JWT를 사용하는 현대적인 보안 구조가 완성되었습니다. 이 아키텍처는 확장성이 뛰어나 어떤 프론트엔드 환경(Web, Android, iOS)에서도 동일한 인증 로직을 유지할 수 있게 해줍니다.

© 2026 code-resting. All rights reserved.

반응형

댓글