스프링 Spring
18. OAuth2.0 인증 및 소셜 로그인(Google, Facebook, GitHub) 적용
안녕하세요! 태마입니다.
Spring 기초 강좌입니다.
강좌의 경우
1. 주제 간단 정리
2. 상세 주제 정리
으로 이루어져 있습니다.
스프링 Spring
포스팅 시작하겠습니다 :)
1. 주제 간단 정리
1. OAuth2.0이란?
✔ OAuth2.0(Open Authorization)은 타사 서비스(Google, Facebook 등)의 계정을 사용하여 안전하게 인증을 수행하는 프로토콜
✔ 비밀번호를 공유하지 않고도 사용자의 인증을 위임할 수 있음
📌 OAuth2.0의 주요 특징
토큰 기반 인증 | Access Token을 사용하여 API 요청을 인증 |
보안성 향상 | 비밀번호를 직접 입력하지 않아도 인증 가능 |
타사 로그인 지원 | Google, Facebook, GitHub 등의 외부 서비스 계정을 활용 가능 |
권한 범위 지정 가능 | 특정 데이터만 접근할 수 있도록 제한 가능 |
📌 OAuth2.0을 사용하면 "사용자 인증을 쉽게 처리하면서도 보안성을 유지 가능"
2. OAuth2.0 인증 흐름
✔ OAuth2.0 인증은 Access Token을 발급받아 API 요청 시 인증을 수행
📌 OAuth2.0 인증 흐름
1️⃣ 사용자가 Google, Facebook, GitHub 등의 로그인 페이지에서 인증 수행
2️⃣ 인증이 완료되면 Authorization Server가 Access Token을 발급
3️⃣ 클라이언트는 Access Token을 사용하여 보호된 리소스에 접근
📌 OAuth2.0 인증 방식이 필요한 경우
✔ 소셜 로그인을 제공하여 사용자 접근성을 향상시키고 싶을 때
✔ 비밀번호를 직접 관리하지 않고도 인증을 수행하고 싶을 때
✔ API 인증을 위해 Access Token을 활용하고 싶을 때
📌 OAuth2.0을 활용하면 "소셜 로그인 및 외부 API 인증을 쉽게 구현 가능"
✅ 여기까지 OAuth2.0의 개념과 인증 흐름을 배웠습니다!
👉 "그렇다면, Spring Boot에서 OAuth2.0 기반 소셜 로그인을 어떻게 구현할까?"
✅ 2부에서 Spring Boot에서 OAuth2.0을 설정하고 소셜 로그인(Google, Facebook, GitHub) 적용 방법을 배워봅시다!
2. 상세 주제 정리
1. Spring Boot 프로젝트에 OAuth2.0 의존성 추가
✔ Spring Security와 OAuth2.0 인증을 사용하려면 spring-boot-starter-oauth2-client 의존성을 추가해야 함
📌 1️⃣ build.gradle 설정
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
}
✔ OAuth2.0 클라이언트를 지원하는 라이브러리 추가
2. OAuth2.0 소셜 로그인 설정 (application.yml)
✔ Google, Facebook, GitHub 등의 OAuth2.0 설정을 추가해야 함
📌 application.yml 설정 예시 (Google 로그인)
spring:
security:
oauth2:
client:
registration:
google:
client-id: your-google-client-id
client-secret: your-google-client-secret
scope: profile, email
✔ Google OAuth2.0 Client ID와 Secret을 등록하여 OAuth2 인증 활성화
📌 OAuth2.0을 설정하면 "자동으로 소셜 로그인 기능을 제공 가능"
3. SecurityConfig 설정 – OAuth2 소셜 로그인 적용
✔ OAuth2 로그인 기능을 활성화하기 위해 Security 설정을 추가
📌 SecurityConfig 클래스
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf(csrf -> csrf.disable()) // CSRF 보호 비활성화
.authorizeHttpRequests(auth -> auth
.requestMatchers("/").permitAll() // 모든 사용자 접근 가능
.anyRequest().authenticated()
)
.oauth2Login(oauth2 -> oauth2 // OAuth2 로그인 활성화
.defaultSuccessUrl("/home", true)
);
return http.build();
}
}
✔ OAuth2 로그인을 활성화하고, 인증 후 /home 페이지로 이동
📌 OAuth2 소셜 로그인을 적용하면 "별도의 로그인 페이지 없이 소셜 로그인 기능을 활용 가능"
4. OAuth2 로그인 정보 가져오기 (OAuth2UserService 활용)
✔ OAuth2 로그인을 하면 사용자 정보를 가져올 수 있음
📌 OAuth2UserService 구현
import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
import org.springframework.stereotype.Service;
@Service
public class CustomOAuth2UserService extends DefaultOAuth2UserService {
@Override
public OAuth2User loadUser(OAuth2AuthenticationToken authentication) {
OAuth2User user = super.loadUser(authentication);
System.out.println("OAuth2 로그인 사용자 정보: " + user.getAttributes());
return user;
}
}
✔ OAuth2 로그인 후 사용자 정보를 가져와 출력
📌 OAuth2UserService를 활용하면 "소셜 로그인 후 사용자 정보를 쉽게 관리 가능"
5. OAuth2 로그인 후 사용자 정보 저장 (User 엔티티 & Repository 생성)
✔ OAuth2 로그인 후 사용자 정보를 데이터베이스에 저장 가능
📌 User 엔티티 생성
import jakarta.persistence.*;
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
private String provider; // Google, Facebook, GitHub 등
protected User() {}
public User(String name, String email, String provider) {
this.name = name;
this.email = email;
this.provider = provider;
}
// Getter & Setter
}
✔ OAuth2 로그인 후 사용자 정보를 저장할 테이블 생성
📌 OAuth2를 활용하면 "소셜 로그인 사용자를 데이터베이스에 저장 가능"
📌 UserRepository 생성 – 사용자 정보 저장
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);
}
✔ 이메일을 기준으로 사용자를 조회하여 로그인 처리 가능
📌 로그인한 사용자 정보 저장 로직 추가
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.stereotype.Service;
@Service
public class OAuth2UserService {
private final UserRepository userRepository;
public OAuth2UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User saveOrUpdate(OAuth2User oAuth2User) {
String email = oAuth2User.getAttribute("email");
String name = oAuth2User.getAttribute("name");
String provider = "google"; // Google 인증 예시
return userRepository.findByEmail(email)
.orElseGet(() -> userRepository.save(new User(name, email, provider)));
}
}
✔ OAuth2 로그인 시 사용자를 저장하고, 기존 사용자는 업데이트
📌 OAuth2 로그인 후 사용자 정보를 관리하면 "소셜 로그인 사용자를 쉽게 식별 가능"
✅ 여기까지 OAuth2.0 인증 및 소셜 로그인(Google, Facebook, GitHub) 적용 방법을 배웠습니다!
👉 "그렇다면, Spring Boot에서 API Gateway 및 Rate Limiting 설정은 어떻게 할까?"
✅ 다음 회차에서 **Spring Boot에서 API Gateway 및 Rate Limiting 설정 (Rate Limiter)**을 배워봅시다!
'IT Developer > Spring' 카테고리의 다른 글
Spring 기초 <20. Spring WebFlux와 비동기 프로그래밍 (Reactor, Mono, Flux 개념)> (1) | 2025.04.06 |
---|---|
Spring 기초 <19. Spring Boot에서 API Gateway 및 Rate Limiting 설정 (Rate Limiter)> (0) | 2025.04.05 |
Spring 기초 <17. Spring Boot에서 JWT(Json Web Token) 인증 구현> (0) | 2025.04.03 |
Spring 기초 <16. Spring Security 기본 개념 및 인증 방식 (JWT, OAuth2, Session 비교)> (0) | 2025.04.02 |
Spring 기초 <15. Spring Batch – 대용량 데이터 처리 및 배치 작업 구현> (0) | 2025.04.01 |
Spring 기초 <14. Spring Boot에서 Redis를 활용한 캐싱(Cache) 전략> (1) | 2025.03.31 |
Spring 기초 <13. Spring Boot에서 JPA를 활용한 CRUD 구현> (0) | 2025.03.30 |
Spring 기초 <12. Spring에서 트랜잭션(Transaction) 관리 (@Transactional 활용법)> (0) | 2025.03.29 |