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 패턴 매칭 및 필터 처리
- OAuth2LoginAuthenticationFilter와 SessionAuthenticationFilter를 사용한 세션 관리
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 흐름 이해가 구현 성공의 핵심