[Spring] Spring Boot에서 OAuth 사용

1. 소개

OAuth2 인증이란?

OAuth(”Open Authorization”)는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로 사용되는, 접근 위임을 위한 개방형 표준이다.

Spring Boot에서 OAuth2를 사용하면 소셜 로그인(카카오, 구글, 네이버 등) 또는 OAuth2 인증 서버와의 연동을 쉽게 구현할 수 있다.

Spring Security의 OAuth2 Client 기능을 활용하면, 인증 및 액세스 토큰 관리까지 자동으로 처리할 수 있다.

 

 

기본 개념

OAuth2는 사용자의 로그인 정보를 직접 다루지 않고, 외부 서비스(카카오, 구글 등)을 통해 인증을 수행하는 프로토콜

이를 통해 보안성을 높이고, 사용자 인증을 쉽게 구현할 수 있음

 

OAuth2의 주요 개념

  1. Resource Owner (사용자): 로그인하는 사람
  2. Client (서버): 인증을 요청하는 애플리케이션
  3. Authorization Server (카카오, 구글 등): 인증을 제공하는 서버
  4. Resource Server: 사용자 정보(API 등)를 제공하는 서버
  5. Access Token: 인증이 완료된 후, 보호된 리소스(API)를 요청할 때 사용하는 토큰
  6. Refresh Token: Access Token이 만료되었을 때, 새로운 Access Token을 발급받을 때 사용하는 토큰

 

2. 적용 방법

1. 의존성 추가

build.gradle

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
    implementation 'org.springframework.boot:spring-boot-starter-security'
}

 

 

2. OAuth2  설정 

application.yml - kakao

spring:
  security:
    oauth2:
      client:
        registration:
          kakao:
            client-id: your-client-id  # 카카오에서 발급받은 Client ID
            client-secret: your-client-secret
            redirect-uri: http://localhost:8080/login/oauth2/code/kakao
            authorization-grant-type: authorization_code
            scope:
              - profile_nickname
              - account_email
        provider:
          kakao:
            authorization-uri: https://kauth.kakao.com/oauth/authorize
            token-uri: https://kauth.kakao.com/oauth/token
            user-info-uri: https://kapi.kakao.com/v2/user/me
            user-name-attribute: id

 

application.yml - Google

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: your-google-client-id
            client-secret: your-google-client-secret
            scope:
              - profile
              - email

 

 

3. OAuth2 로그인 컨트롤러 만들기

 

OAuth2 로그인이 완료되면, Spring Security가 자동으로 사용자 정보를 가져오고, 이를 컨트롤러에서 확인할 수 있다.

@RestController
@RequestMapping("/api/auth")
public class AuthController {

    @GetMapping("/user")
    public ResponseEntity<Map<String, Object>> getUser(@AuthenticationPrincipal OAuth2User oauth2User) {
        return ResponseEntity.ok(oauth2User.getAttributes());
    }
}

 

@AuthenticationPrincipal OAuth2User oauth2User -> 현재 로그인한 사용자 정보

사용자의 카카오 프로필 정보, 이메일 등을 확인 가능

 

 

4. OAuth2 로그인 후 JWT 발급 (프론트엔드 연동)

OAuth2 로그인이 완료된 후, 우리 서버에서 JWT(JSON Web Token) 을 발급해서 프론트엔드와 연동할 수 있다.

 

@RestController
@RequestMapping("/api/auth")
public class AuthController {

    private final JwtUtil jwtUtil;

    public AuthController(JwtUtil jwtUtil) {
        this.jwtUtil = jwtUtil;
    }

    @GetMapping("/kakao/callback")
    public ResponseEntity<?> kakaoCallback(@AuthenticationPrincipal OAuth2User oauth2User) {
        String email = oauth2User.getAttribute("kakao_account").get("email").toString();
        
        // JWT 발급
        String jwtToken = jwtUtil.generateToken(email);
        
        return ResponseEntity.ok(new AuthResponse(jwtToken));
    }

    static class AuthResponse {
        private String token;
        public AuthResponse(String token) { this.token = token; }
        public String getToken() { return token; }
    }
}

 

 

3. OAuth2 인증 흐름 정리

1. 사용자가 로그인 버튼 클릭 → 카카오/구글 로그인 페이지 이동
2. 사용자가 인증 완료 → 리디렉트 URI로 인증 코드 전달
3. Spring Boot가 인증 코드를 받아서 Access Token 요청
4. Access Token을 사용해 사용자 정보 요청 (/user)
5. 사용자 정보를 바탕으로 JWT를 발급하고 프론트엔드에 전달
6. 프론트엔드는 JWT를 저장하고 API 요청 시 사용

 

참고

 

[OAuth] OAuth 2.0의 개념과 과정

안녕! 우아한테크코스 5기 [스탬프크러쉬]팀 깃짱이라고 합니다. 스탬프크러쉬 서비스의 소스 코드 바로가기 💋 인트로 우테코 프로젝트를 진행하면서 회원가입 및 로그인 기능을 구현해야 했

engineerinsight.tistory.com