Spring Cloud Azure 사용하여 REST API 보호

이 자습서에서는 Spring Boot 애플리케이션에서 Microsoft Entra ID REST API 보호를 사용하도록 설정하는 방법을 보여 줍니다.

이 문서에서는 설문 조사 시스템을 예로 사용합니다. 설문 조사 시스템은 다음 REST API를 제공합니다.

  • GET /api/survey/question 는 설문 조사를 보기 위한 것입니다.
  • POST /api/survey 는 설문 조사를 채우기 위한 것입니다.
  • GET /api/survey 는 설문 조사 결과를 보기 위한 것입니다.

이 문서에서는 RBAC(역할 기반 액세스 제어)를 적용하여 다음 요구 사항을 적용하여 이러한 API를 보호합니다.

  • GET /api/survey/question 는 각 요청에 사용할 수 있습니다.
  • POST /api/survey 는 범위가 부여된 액세스 토큰 SCOPE_Survey.User 을 포함하는 인증된 사용자 요청에 사용할 수 있습니다.
  • GET /api/survey 는 범위가 부여된 액세스 토큰 SCOPE_Survey.Admin 을 포함하는 인증된 관리자 사용자 요청에 사용할 수 있습니다.

필수 조건

중요합니다

이 문서의 단계를 완료하려면 Spring Boot 버전 2.5 이상이 필요합니다.

REST API 등록

다음 단계를 사용하여 Azure 포털에서 웹 API를 등록합니다.

  1. Azure 포털 로그인합니다.

  2. 여러 테넌트에 액세스할 수 있는 경우 디렉터리 + 구독 필터()를 사용하여 애플리케이션을 등록할 테넌트를’ 선택합니다.

  3. Microsoft Entra ID 찾아 선택합니다.

  4. 관리 아래에서 앱 등록>새 등록을 선택합니다.

  5. 예를 들어 이름 필드에 애플리케이션 이름을 입력합니다(예: Api-SurveyService). 앱 사용자에게 이 이름이 표시될 수 있으며 나중에 변경할 수 있습니다.

  6. 지원되는 계정 유형에는 모든 조직 디렉터리의 계정을 선택합니다.

  7. 등록을 선택하여 애플리케이션을 만듭니다.

  8. 앱 개요 페이지에서 애플리케이션(클라이언트) ID 값을 찾은 후 나중에 사용할 수 있도록 기록합니다. 이 값은 이 프로젝트의 YAML 구성 파일을 구성하는 데 필요합니다.

  9. 관리에서 API 표시>범위 추가를 선택합니다. api://{clientId}을 선택하여 제안된 애플리케이션 ID URI()를 수락한 후, 다음 정보를 입력합니다.

    • 범위 이름으로 Survey.User를 입력합니다.
    • 동의할 수 있는 사용자에 대해 관리자 및 사용자를 선택합니다.
    • 관리자 동의 표시 이름란에 Access the survey service as a user.을(를) 입력합니다.
    • 관리자 동의 설명을 보려면 .를 입력합니다Allows the users to write data in survey system..
    • 사용자 동의 표시 이름에 을 입력합니다Access the survey service as a user..
    • 사용자 동의 설명을 보려면 .를 입력합니다Allows the users to write data in survey system..
    • 상태는 활성화됨으로 유지하세요.
    • 범위 추가를 선택합니다.
  10. 이전 단계를 반복하여 다른 범위를 추가합니다. 범위 추가를 선택하면 다음 정보를 입력합니다.

    • 범위 이름으로 Survey.Admin를 입력합니다.
    • 동의할 수 있는 사용자에 대해 관리자 및 사용자를 선택합니다.
    • 관리자 동의 표시 이름란에 Access the survey service as a admin.을(를) 입력합니다.
    • 관리자 동의 설명을 보려면 .를 입력합니다Allows the users to view data in survey system..
    • 사용자 동의 표시 이름에 을 입력합니다Access the survey service as a admin..
    • 사용자 동의 설명을 보려면 .를 입력합니다Allows the users to view data in survey system..
    • 상태는 활성화됨으로 유지하세요.
    • 범위 추가를 선택합니다.

Spring Cloud Azure Starter Microsoft Entra ID 사용하도록 설정

다음으로, Spring Cloud Azure REST API 보호를 사용하도록 설정합니다.

보안 종속성 추가

Spring Cloud Azure Starter Azure Active Directory 모듈을 설치하려면 pom.xml 파일에 다음 종속성을 추가합니다.

  • Spring Cloud Azure BOM(구성 요소 목록):

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.azure.spring</groupId>
          <artifactId>spring-cloud-azure-dependencies</artifactId>
          <version>7.4.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    비고

    Spring Boot 4.0.x를 사용하는 경우 버전을 7.4.0.로 설정합니다spring-cloud-azure-dependencies.

    Spring Boot 3.5.x를 사용하는 경우 버전을 6.5.0.로 설정합니다spring-cloud-azure-dependencies.

    Spring Boot 3.1.x-3.5.x를 사용하는 경우, spring-cloud-azure-dependencies 버전을 5.25.0로 설정해야 합니다.

    Spring Boot 2.x를 사용하는 경우 spring-cloud-azure-dependencies 버전을 4.20.0로 설정해야 합니다.

    이 BOM(자재 명세서)을 <dependencyManagement> 섹션의 pom.xml 파일에서 구성해야 합니다. 이렇게 하면 모든 Spring Cloud Azure 종속성이 동일한 버전을 사용하게 됩니다.

    이 BOM에 사용되는 버전에 대한 자세한 내용은 스프링 클라우드 Azure 사용해야 하는 경우 참조하세요.

  • Spring Cloud Azure Starter Microsoft Entra 아티팩트:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-active-directory</artifactId>
    </dependency>
    
  • Spring Boot Starter OAuth2 리소스 서버 아티팩트:

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

HTTP 요청 권한 부여

설문 조사 REST API를 보호하려면 다음 예제와 같이 보호를 사용하도록 설정하기 위해 구체적인 범위 이름으로 주석 @PreAuthorize("hasAuthority('SCOPE_Survey.xxx')") 을 추가합니다.

import org.springframework.http.MediaType;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;
import java.util.LinkedHashMap;
import java.util.Map;

@RestController
@RequestMapping("/api/survey")
public class SurveyController {

    private static final String QUESTION = "Which sports do you like most?";
    private final Map<LocalDateTime, String> surveys = new LinkedHashMap<>();

    @GetMapping(value = "/question", produces = MediaType.APPLICATION_JSON_VALUE)
    public String question() {
        return QUESTION;
    }

    @PostMapping
    @PreAuthorize("hasAuthority('SCOPE_Survey.User')")
    public String addAnswer(@RequestParam("answer") String answer) {
        if (StringUtils.hasText(answer)) {
            surveys.put(LocalDateTime.now(), answer);
            return "succeeded";
        }
        return "Failed";
    }

    @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
    @PreAuthorize("hasAuthority('SCOPE_Survey.Admin')")
    public Map<LocalDateTime, String> list() {
        return surveys;
    }
}

다음 예제와 같이 YAML 구성을 업데이트합니다.

spring:
  cloud:
    azure:
      active-directory:
        enabled: true
        credential:
          client-id: <your-application-ID-of-Api-SurveyService>
        app-id-uri: <your-application-ID-URI-of-Api-SurveyService>

비고

v1.0 토큰에서는 구성에 API의 클라이언트 ID가 필요하지만 v2.0 토큰에서는 요청에서 클라이언트 ID 또는 애플리케이션 ID URI를 사용할 수 있습니다. 대상 그룹 유효성 검사를 제대로 완료하도록 둘 다 구성할 수 있습니다.

Azure Spring Apps로 배포하십시오

Spring Boot 애플리케이션을 로컬로 실행한 후 프로덕션으로 이동할 수 있습니다. Azure Spring Apps 사용하면 코드를 변경하지 않고도 Azure Spring Boot 애플리케이션을 쉽게 배포할 수 있습니다. 이 서비스는 개발자가 코드에 집중할 수 있도록 Spring 애플리케이션의 인프라를 관리합니다. Azure Spring Apps 포괄적인 모니터링 및 진단, 구성 관리, 서비스 검색, CI/CD 통합, 청록색 배포 등을 사용하여 수명 주기 관리를 제공합니다. 자세한 내용은 Quickstart: Azure Spring Apps 첫 번째 애플리케이션 배포를 참조하세요.

다음 단계

Spring 개발자를 위한 AzureSpring Cloud Microsoft Entra ID 샘플