[Spring Boot] OAuth2

handa·2025년 1월 8일
0
post-thumbnail

OAuth2는 인증 및 권한 부여를 위한 업계 표준 프로토콜로, 제3자가 사용자 데이터를 접근할 수 있도록 안전한 메커니즘을 제공합니다. 이를 통해 사용자는 자신의 자격 증명을 공유하지 않고도 애플리케이션에 권한을 부여할 수 있습니다. Spring Security는 OAuth2를 간단하게 구현할 수 있는 강력한 기능을 제공합니다.


OAuth2란?

OAuth2는 사용자가 자신의 인증 정보를 노출하지 않고, 제3자 애플리케이션이 사용자 리소스에 안전하게 접근할 수 있도록 설계된 프로토콜입니다.

OAuth2의 주요 개념

  1. Resource Owner (자원 소유자)
    • 사용자를 의미하며, 자신의 리소스(데이터)에 접근 권한을 제공합니다.
  2. Client (클라이언트)
    • Resource Owner가 승인한 리소스에 접근하려는 애플리케이션입니다.
  3. Authorization Server (권한 서버)
    • 사용자 인증을 수행하고, 접근 토큰(Access Token)을 발급합니다.
  4. Resource Server (자원 서버)
    • 보호된 리소스(API)를 호스팅하며, 접근 토큰을 확인하고 요청을 처리합니다.
  5. Access Token (접근 토큰)
    • 클라이언트가 자원 서버에 요청할 때 사용하는 인증 토큰입니다.

OAuth2의 주요 인증 흐름

OAuth2는 다양한 인증 흐름을 제공합니다. 가장 일반적으로 사용되는 두 가지는 다음과 같습니다.

1. Authorization Code Grant

  • 주로 웹 애플리케이션에서 사용됩니다.
  • 코드 교환 과정을 통해 Access Token을 얻습니다.

흐름
1. 클라이언트는 권한 서버에 인증 요청.
2. 사용자는 로그인 및 권한 부여.
3. 권한 서버가 Authorization Code를 클라이언트에게 전달.
4. 클라이언트는 Authorization Code로 Access Token 요청.
5. 권한 서버가 Access Token 발급.

2. Client Credentials Grant

  • 주로 서버 간 통신에서 사용됩니다.
  • 사용자가 아닌 클라이언트 자신이 인증합니다.

흐름
1. 클라이언트는 권한 서버에 클라이언트 자격 증명(Client ID 와 Secret)으로 요청.
2. 권한 서버가 Access Token 발급.


Spring Boot에서 OAuth2 설정

Spring Boot와 Spring Security를 사용하면 OAuth2 인증을 손쉽게 구현할 수 있습니다.

1. Dependency 추가

Maven 프로젝트의 경우 pom.xml에 다음을 추가합니다.

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring.boot-starter-oauth2-client</artifactId>
</dependency>

2. 기본 설정

OAuth2 클라이언트의 설정을 application.yml 파일에 작성합니다.

예: Google OAuth2 설정

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: YOUR_GOOGLE_CLIENT_ID
            client-secret: YOUR_GOOGLE_CLIENT_SECRET
            scope:
              - profile
              - email
            redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
        provider:
          google:
            authorization-uri: https://accounts.google.com/o/oauth2/auth
            token-uri: https://oauth2.googleapis.com/token
            user-info-uri: https://openidconnect.googleapis.com/v1/userinfo

3. OAuth2 클라이언트 설정

Spring Security는 자동으로 OAuth2 로그인 페이지를 생성하고 사용자를 인증합니다.

컨트롤러 예제

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;

@RestController
public class OAuth2Controller {

    @GetMapping("/user")
    public String userInfo(OAuth2AuthenticationToken authentication) {
        return "Authenticated user: " + authentication.getPrincipal().getAttributes();
    }
}

4. Resource Server 설정

리소스 서버에서 토큰을 검증하려면 다음 의존성을 추가합니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>

설정 예:

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: https://your-authorization-server.com

리소스 서버는 JWT 토큰을 검증하고 보호된 리소스에 접근을 허용합니다.


OAuth2와 Spring Boot의 주요 사용 사례

  1. OAuth2 Login
    • 소셜 로그인(예: Google, Facebook 등)을 지원합니다.
  2. API 보안
    • OAuth2를 통해 보호된 API에 대한 접근 제어를 설정합니다.
  3. 권한 부여 서비스 구축
    • 자체 인증 및 권한 서버를 만들어 사용자 인증 및 토큰 발급을 처리합니다.

OAuth2 사용 시 장점

  1. 사용자 자격 증명을 노출하지 않아 보안성이 높습니다.
  2. 다양한 인증 흐름을 제공해 유연성이 뛰어납니다.
  3. Spring Security와의 통합으로 간단한 설정으로 강력한 기능을 활용할 수 있습니다.

profile
진짜 해보자

0개의 댓글