Spring Security로 GitHub OAuth2 소셜 로그인 구현 방법

Spring Security] GitHub OAuth2 소셜 로그인 구현하기(+Spring Security를 왜 써야할까?)

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

웹 개발, DevOps

대상자

  • *Spring Security를 사용하는 웹 개발자** (OAuth2 인증 구현 및 보안 강화 필요 시)
  • 난이도: 중간 (기본 Spring Security 이해 필요)

핵심 요약

  • Spring Security는 OAuth2 클라이언트 기능을 기본 지원하여 간단한 설정으로 소셜 로그인 구현 가능
  • OAuth2User 객체와 @AuthenticationPrincipal 사용으로 사용자 인증 정보를 간편하게 활용 가능
  • Client ID/Secret 보안 관리CustomOAuth2UserService 구현이 필수적 (보안 취약점 방지)

섹션별 세부 요약

1. OAuth2 기본 개념

  • OAuth2는 제3자 인증을 위임하여 보안성 강화 (비밀번호 저장 불필요)
  • Authorization Code 흐름을 기반으로 Access Token 발급 (HTTPS 필수, PKCE 권장)
  • OAuth2 vs OAuth1:

- OAuth1: 서명 기반 보안 강화 (복잡성 문제)

- OAuth2: 유연한 흐름 지원 (Bearer Token 취약점 주의)

  • OAuth3: 현재 IETF Internet Draft 수준 (연구 단계)

2. Spring Security의 역할

  • OAuth2 흐름의 6~10단계 자동 처리 (Access Token 요청, 사용자 정보 추출, 인증 객체 생성)
  • SecurityFilterChain 설정을 통해 요청 URL 패턴 매칭 및 필터 처리
  • OAuth2LoginAuthenticationFilterSessionAuthenticationFilter를 사용한 세션 관리

3. GitHub OAuth2 설정

  • application.yml에 Client ID/Secret, redirect-uri 등록 (예: spring.security.oauth2.client.registration.github.client-id)
  • provider 설정: authorization-uri, token-uri, user-info-uri 등 기본값 사용 가능
  • Client Secret 노출 방지 (예: 환경 변수 또는 암호화 저장)

4. 코드 구현

  • SecurityConfig 클래스:

- @EnableWebSecurity 애노테이션으로 보안 설정 활성화

- SecurityFilterChain을 통해 oauth2Login() 설정 (success/failure handler 커스터마이징)

  • CustomOAuth2UserService:

- loadUser() 메서드에서 GitHub 사용자 정보 추출 및 DB 저장

- DefaultOAuth2User 객체 생성 (권한 ROLE_USER 부여)

  • CustomOAuth2SuccessHandler:

- 로그인 성공 시 세션 생성 및 Redis에 Access Token 저장 (예: redisTemplate.opsForValue().set())

  • CustomLogoutHandler:

- 로그아웃 시 세션 제거 (sessionManager.clearSession())

결론

  • Spring Security를 사용하면 OAuth2 인증 과정의 복잡성을 크게 줄일 수 있음
  • Client Secret 보안 관리CustomOAuth2UserService 구현이 필수 (보안 취약점 방지)
  • Redis를 활용한 Access Token 저장세션 관리는 로그인/로그아웃 흐름의 안정성을 높임
  • application.yml의 정확한 설정OAuth2 흐름 이해가 구현 성공의 핵심