IT Developer/Spring

Spring 기초 <18. OAuth2.0 인증 및 소셜 로그인(Google, Facebook, GitHub) 적용>

TEMA_ 2025. 4. 4. 13:24
반응형

스프링 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)**을 배워봅시다!

반응형