본문 바로가기

Study Information Technology

Spring Boot와 OAuth2 통합하기

728x90
반응형

Spring Boot와 OAuth2 통합하기

Overview

Spring Boot와 OAuth2를 통합하는 것은 보안된 웹 애플리케이션을 구축할 때 중요한 작업입니다. OAuth2는 사용자 인증 및 권한 부여를 처리하는 표준 프로토콜로, 다양한 서드파티 애플리케이션과의 통합을 가능하게 합니다. 이 설명에서는 Spring Boot 애플리케이션에서 OAuth2를 설정하고 사용하는 방법을 자세히 다루겠습니다.

OAuth2 개요

OAuth2는 인터넷 애플리케이션이 사용자 자원을 안전하게 접근할 수 있도록 하는 프로토콜입니다. 사용자 자원에는 사용자의 프로필 정보, 게시물, 친구 목록 등 다양한 정보가 포함될 수 있습니다. OAuth2는 네 가지 주요 역할을 포함합니다:

  • 자원 소유자(Resource Owner): 자원의 주체로, 자원을 보호하고 애플리케이션에 접근 권한을 부여합니다.
  • 자원 서버(Resource Server): 자원을 저장하고, 권한을 가진 애플리케이션에게만 자원에 접근하도록 합니다.
  • 인증 서버(Authorization Server): 사용자 인증을 수행하고, 액세스 토큰을 발급합니다.
  • 클라이언트(Client): 자원 소유자를 대신하여 자원 서버에 접근하려는 애플리케이션입니다.

Spring Boot에서 OAuth2 설정하기

Spring Boot에서는 spring-boot-starter-oauth2-clientspring-boot-starter-oauth2-resource-server 라이브러리를 사용하여 OAuth2를 통합할 수 있습니다. 여기서는 OAuth2를 클라이언트 측에서 설정하는 방법과 리소스 서버로 설정하는 방법을 설명하겠습니다.

1. OAuth2 클라이언트 설정

OAuth2 클라이언트를 설정하면, 애플리케이션이 인증 서버로부터 액세스 토큰을 받아 자원 서버에 접근할 수 있게 됩니다. 이를 위해 다음과 같은 단계를 수행합니다.

의존성 추가

build.gradle 또는 pom.xml 파일에 필요한 의존성을 추가합니다.

Gradle (build.gradle)

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

Maven (pom.xml)

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-client</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
</dependencies>
애플리케이션 설정

application.yml 또는 application.properties 파일에 OAuth2 클라이언트 설정을 추가합니다. 예를 들어, Google OAuth2를 사용하는 경우 다음과 같이 설정할 수 있습니다.

application.yml

spring:
security:
oauth2:
client:
registration:
google:
client-id: YOUR_CLIENT_ID
client-secret: YOUR_CLIENT_SECRET
scope:
- profile
- email
redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
authorization-grant-type: authorization_code
provider:
google:
authorization-uri: https://accounts.google.com/o/oauth2/auth
token-uri: https://oauth2.googleapis.com/token
user-info-uri: https://www.googleapis.com/oauth2/v3/userinfo

여기서 client-idclient-secret은 Google 개발자 콘솔에서 발급받은 값입니다. redirect-uri는 사용자가 로그인 후 리디렉션될 URI입니다.

보안 설정

스프링 시큐리티를 사용하여 OAuth2 클라이언트를 설정합니다. 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.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
import org.springframework.security.oauth2.client.web.OAuth2LoginAuthenticationFilter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableOAuth2Client;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/login**").permitAll()
.anyRequest().authenticated()
.and()
.oauth2Login()
.defaultSuccessURL("/home", true)
.failureURL("/login?error");
}
}

여기서 /login**은 로그인 페이지를 허용하며, 다른 모든 요청은 인증이 필요합니다. 로그인 성공 시 /home으로 리디렉션되고, 실패 시에는 /login?error로 리디렉션됩니다.

2. OAuth2 리소스 서버 설정

OAuth2 리소스 서버는 요청이 올 때 액세스 토큰을 검증하고 자원에 대한 접근을 제어합니다. 리소스 서버로 설정하려면 다음 단계를 따릅니다.

의존성 추가

build.gradle 또는 pom.xml 파일에 리소스 서버 의존성을 추가합니다.

Gradle (build.gradle)

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server'
}

Maven (pom.xml)

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
  </dependency>
</dependencies>
애플리케이션 설정

application.yml 파일에 리소스 서버 설정을 추가합니다. 이 설정은 JWT를 사용하는 경우를 예로 들어 설명합니다.

application.yml

spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: https://example.com/oauth2/issuer

여기서 issuer-uri는 인증 서버의 JWT 발급자 URI입니다. 이 설정은 JWT 토큰의 서명을 검증하는 데 사용됩니다.

보안 설정

리소스 서버를 구성하기 위해 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.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter;
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationProvider;
import org.springframework.security.oauth2.server.resource.authentication.JwtDecoder;
import org.springframework.security.oauth2.server.resource.authentication.NimbusJwtDecoder;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.oauth2ResourceServer()
.jwt();
return http.build();
}

@Bean
public JwtDecoder jwtDecoder() {
return NimbusJwtDecoder.withIssuerLocation("https://example.com/oauth2/issuer").build();
}
}

여기서 JwtDecoder는 JWT 토큰의 서명을 검증하는 데 사용됩니다. issuerLocation은 JWT 토큰의 발급자를 나타냅니다.

발생할 수 있는 오류와 해결 방법

오류: 401 Unauthorized

이 오류는 토큰이 유효하지 않거나, 토큰이 필요하지만 제공되지 않았을 때 발생합니다. 이는 클라이언트 측에서 토큰을 포함하지 않았거나, 리소스 서버에서 토큰 검증이 실패한 경우에 발생할 수 있습니다.

해결 방법:

  • 클라이언트 애플리케이션에서 올바른 액세스 토큰을 포함했는지 확인합니다.
  • 리소스 서버에서 JWT 디코더가 올바르게 설정되었는지 확인합니다.

오류: 403 Forbidden

이 오류는 사용자가 필요한 권한을 가지고 있지 않을 때 발생합니다. 이는 OAuth2 권한 범위(scope)가 부족한 경우에 발생할 수 있습니다.

해결 방법:

  • 클라이언트 애플리케이션에서 요청한 권한 범위가 올바른지 확인합니다.
  • 리소스 서버에서 권한 검사가 올바르게 설정되었는지 확인합니다.

참고문서

이 문서들은 OAuth2 클라이언트 및 리소스 서버 설정을 더욱 깊이 이해하는 데 도움을 줄 것입니다.

728x90
반응형