본문 바로가기

Study Information Technology

Spring Boot와 OAuth2 리소스 서버 통합

728x90
반응형

Spring Boot와 OAuth2 리소스 서버 통합

Overview

Spring Boot와 OAuth2 리소스 서버를 통합하면 애플리케이션이 안전하게 API를 제공할 수 있으며, 승인된 요청에 대해 액세스 토큰을 검증할 수 있습니다. 이 글에서는 Spring Boot 애플리케이션을 OAuth2 리소스 서버로 설정하는 방법을 자세히 설명하고, 이를 통해 보안 API를 구축하는 데 필요한 주요 개념과 구현 예시를 제공합니다.

1. OAuth2 개념 이해하기

OAuth2는 사용자 인증과 권한 부여를 처리하는 프로토콜입니다. 이를 통해 클라이언트 애플리케이션은 사용자 자원에 접근하기 위해 토큰을 사용하여 서버에 인증 요청을 합니다. 리소스 서버는 이 토큰을 검증하여 요청이 유효한지를 판단합니다.

2. Spring Boot 설정하기

Spring Boot 프로젝트를 생성한 후, pom.xml 파일에 필요한 의존성을 추가합니다. 아래의 의존성을 추가하면 Spring Security와 OAuth2 리소스 서버 기능을 사용할 수 있습니다.

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

3. application.yml 구성하기

리소스 서버의 설정을 위해 application.yml 파일을 다음과 같이 구성합니다. 여기서는 JWT 기반의 액세스 토큰을 검증하는 예를 보여줍니다.

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

issuer-uri는 액세스 토큰을 발급하는 인증 서버의 URI입니다. 이 URI는 JWT의 서명을 검증하는 데 사용됩니다.

4. API 엔드포인트 보호하기

리소스 서버에서 API 엔드포인트를 보호하려면 Spring Security의 규칙을 설정해야 합니다. 아래의 코드 스니펫은 /api/** 경로의 모든 요청이 인증된 사용자만 접근할 수 있도록 설정합니다.

import org.springframework.context.annotation.Bean;
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;

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/api/**").authenticated()
.and()
.oauth2ResourceServer()
.jwt();
}
}

5. JWT 토큰 검증하기

리소스 서버는 JWT를 사용하여 클라이언트의 요청을 검증합니다. 클라이언트가 API에 요청할 때, Authorization 헤더에 Bearer 토큰을 포함해야 합니다. 예를 들어:

GET /api/resource
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

리소스 서버는 이 토큰을 검증하고, 유효한 경우에만 리소스를 반환합니다. 만약 토큰이 유효하지 않다면, 401 Unauthorized 에러가 발생합니다.

6. 에러 처리하기

JWT 검증 중 에러가 발생할 수 있습니다. 예를 들어, 만료된 토큰의 경우, Spring Security는 ExpiredJwtException을 발생시킵니다. 이를 처리하기 위해 커스텀 에러 핸들러를 구현할 수 있습니다.

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;

@ControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler(ExpiredJwtException.class)
@ResponseStatus(HttpStatus.UNAUTHORIZED)
public void handleExpiredToken(ExpiredJwtException e) {
// 추가적인 로깅이나 처리 로직
}
}

이제 만약 클라이언트가 만료된 토큰으로 요청을 보낸다면, 서버는 401 상태 코드를 반환하게 됩니다.

7. 테스트하기

설정이 완료되면 Postman이나 cURL을 이용해 API를 테스트할 수 있습니다. 유효한 JWT를 포함하여 요청을 보내고, 리소스 서버가 이를 올바르게 처리하는지 확인합니다.

curl -H "Authorization: Bearer your-valid-jwt" http://localhost:8080/api/resource

결론

Spring Boot와 OAuth2 리소스 서버의 통합은 안전한 API를 구축하는 데 있어 중요한 과정입니다. 이 글에서 설명한 단계들을 따라 설정을 진행하면, 인증된 사용자만 리소스에 접근할 수 있도록 보호할 수 있습니다. 또한, JWT를 통해 클라이언트의 요청을 안전하게 검증할 수 있습니다.

참고문서

반응형