

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 에 대한 FHIR 기반 SMART 지원 AWS HealthLake
<a name="reference-smart-on-fhir"></a>

FHIR 지원 HealthLake 데이터 스토어의 대체 가능한 의료 애플리케이션 및 재사용 가능한 기술(SMART)을 사용하면 FHIR 준수 애플리케이션의 SMART에 액세스할 수 있습니다. HealthLake 데이터는 타사 권한 부여 서버를 사용하여 요청을 인증하고 권한을 부여하여 액세스합니다. 따라서를 통해 사용자 자격 증명을 관리하는 대신 FHIR 준수 권한 부여 서버의 SMART를 사용하여 AWS Identity and Access Management사용자 자격 증명을 관리합니다.

**참고**  
HealthLake는 FHIR 버전 1.0 및 2.0에서 SMART를 지원합니다. 이러한 프레임워크에 대한 자세한 내용은 *FHIR R4 설명서*의 [SMART 앱 시작](https://www.hl7.org/fhir/smart-app-launch/)을 참조하세요.  
HealthLake 데이터 스토어는 FHIR 요청에서 SMART에 대해 다음과 같은 인증 및 권한 부여 프레임워크를 지원합니다.  
**OpenID(AuthN)**: 개인 또는 클라이언트 애플리케이션을 인증하기 위한 사용자(또는 대상)입니다.
**OAuth 2.0(AuthZ)**: HealthLake 데이터 스토어의 어떤 FHIR 리소스에 인증된 요청을 읽거나 쓸 수 있는지 승인하는 데 사용됩니다. 이는 권한 부여 서버에 설정된 범위에 의해 정의됩니다.

 AWS CLI 또는 AWS SDKs. 자세한 내용은 [HealthLake 데이터 스토어 생성](managing-data-stores-create.md) 단원을 참조하십시오.

**Topics**
+ [FHIR에서 SMART 시작하기](reference-smart-on-fhir-getting-started.md)
+ [FHIR의 SMART에 대한 HealthLake 인증 요구 사항](reference-smart-on-fhir-authentication.md)
+ [HealthLake에서 지원하는 FHIR OAuth 2.0 범위의 SMART](reference-smart-on-fhir-oauth-scopes.md)
+ [를 사용한 토큰 검증 AWS Lambda](reference-smart-on-fhir-token-validation.md)
+ [FHIR 기반 SMART 지원 HealthLake 데이터 스토어에서 세분화된 권한 부여 사용](reference-smart-on-fhir-fine-grained-authorization.md)
+ [FHIR 검색 문서에서 SMART 가져오기](reference-smart-on-fhir-discovery-document.md)
+ [SMART 지원 HealthLake 데이터 스토어에서 FHIR REST API 요청](reference-smart-on-fhir-request-example.md)

# FHIR에서 SMART 시작하기
<a name="reference-smart-on-fhir-getting-started"></a>

다음 주제에서는 AWS HealthLake에 대한 FHIR 권한 부여에서 SMART를 시작하는 방법을 설명합니다. AWS 여기에는 계정에서 프로비저닝해야 하는 리소스, FHIR 지원 HealthLake 데이터 스토어에서 SMART 생성, FHIR 클라이언트 애플리케이션에서 권한 부여 서버 및 HealthLake 데이터 스토어와 상호 작용하는 방법의 예가 포함됩니다.

**Topics**
+ [FHIR에서 SMART에 대한 리소스 설정](#smart-on-fhir-resources)
+ [FHIR에서 SMART를 위한 클라이언트 애플리케이션 워크플로](#smart-on-fhir-client-app-workflow)

## FHIR에서 SMART에 대한 리소스 설정
<a name="smart-on-fhir-resources"></a>

다음 단계에서는 HealthLake에서 FHIR 요청에 대한 SMART를 처리하는 방법과 요청에 필요한 리소스를 정의합니다. 다음 요소는 워크플로에서 함께 작동하여 FHIR에서 SMART 요청을 생성합니다.
+ **최종 사용자**: 일반적으로 환자 또는 임상의가 FHIR 기반 타사 SMART 애플리케이션을 사용하여 HealthLake 데이터 스토어의 데이터에 액세스합니다.
+ **FHIR 기반 SMART 애플리케이션(클라이언트 애플리케이션이라고 함)**: HealthLake 데이터 스토어에 있는 데이터에 액세스하려는 애플리케이션입니다.
+ **권한 부여 서버**: 사용자를 인증하고 액세스 토큰을 발급할 수 있는 OpenID Connect 호환 서버입니다.
+ **HealthLake 데이터 스토어**: 보유자 토큰을 제공하는 FHIR REST 요청에 응답하기 위해 Lambda 함수를 사용하는 FHIR 지원 HealthLake 데이터 스토어의 SMART입니다.

이러한 요소가 함께 작동하려면 다음 리소스를 생성해야 합니다.

**참고**  
권한 부여 서버를 설정하고, 권한 부여 서버에 필요한 [범위를](reference-smart-on-fhir-oauth-scopes.md) 정의하고, [토큰](reference-smart-on-fhir-token-validation.md) 내부 검사를 처리하는 AWS Lambda 함수를 생성한 후 FHIR 지원 HealthLake 데이터 스토어에서 SMART를 생성하는 것이 좋습니다.

**1. 권한 부여 서버 엔드포인트 설정**  
SMART on FHIR 프레임워크를 사용하려면 데이터 스토어에서 이루어진 FHIR REST 요청을 검증할 수 있는 타사 권한 부여 서버를 설정해야 합니다. 자세한 내용은 [FHIR의 SMART에 대한 HealthLake 인증 요구 사항](reference-smart-on-fhir-authentication.md) 단원을 참조하십시오.

**2. 권한 부여 서버의 범위를 정의하여 HealthLake 데이터 스토어 액세스 수준 제어**  
SMART on FHIR 프레임워크는 OAuth 범위를 사용하여 인증된 요청이 액세스할 수 있는 FHIR 리소스와 범위를 결정합니다. 범위를 정의하는 것은 최소 권한을 설계하는 방법입니다. 자세한 내용은 [HealthLake에서 지원하는 FHIR OAuth 2.0 범위의 SMART](reference-smart-on-fhir-oauth-scopes.md) 단원을 참조하십시오.

**3. 토큰 내부 검사를 수행할 수 있는 AWS Lambda 함수 설정**  
SMART on FHIR 지원 데이터 스토어의 클라이언트 애플리케이션에서 보낸 FHIR REST 요청에는 JSON 웹 토큰(JWT)이 포함됩니다. 자세한 내용은 [JWT 디코딩을](reference-smart-on-fhir-token-validation.md) 참조하세요.

**4. FHIR 지원 HealthLake 데이터 스토어에서 SMART 생성**  
FHIR HealthLake 데이터 스토어에서 SMART를 생성하려면를 제공해야 합니다`IdentityProviderConfiguration`. 자세한 내용은 [HealthLake 데이터 스토어 생성](managing-data-stores-create.md) 단원을 참조하십시오.

## FHIR에서 SMART를 위한 클라이언트 애플리케이션 워크플로
<a name="smart-on-fhir-client-app-workflow"></a>

다음 섹션에서는 클라이언트 애플리케이션을 시작하고 FHIR의 SMART 컨텍스트 내에서 HealthLake 데이터 스토어에서 성공적인 FHIR REST 요청을 하는 방법을 설명합니다.

**1. 클라이언트 애플리케이션을 사용하여 잘 알려진 Uniform Resource Identifier에 `GET` 요청**  
SMART 지원 클라이언트 애플리케이션은 HealthLake 데이터 스토어의 권한 부여 엔드포인트를 찾기 위해 `GET` 요청해야 합니다. 이는 잘 알려진 URI(Uniform Resource Identifier) 요청을 통해 수행됩니다. 자세한 내용은 [FHIR 검색 문서에서 SMART 가져오기](reference-smart-on-fhir-discovery-document.md) 단원을 참조하십시오.

**2. 액세스 및 범위 요청**  
클라이언트 애플리케이션은 사용자가 로그인할 수 있도록 권한 부여 서버의 권한 부여 엔드포인트를 사용합니다. 이 프로세스는 사용자를 인증합니다. 범위는 클라이언트 애플리케이션이 액세스할 수 있는 HealthLake 데이터 스토어의 FHIR 리소스를 정의하는 데 사용됩니다. 자세한 내용은 [HealthLake에서 지원하는 FHIR OAuth 2.0 범위의 SMART](reference-smart-on-fhir-oauth-scopes.md) 단원을 참조하십시오.

**3. 액세스 토큰**  
이제 사용자가 인증되었으므로 클라이언트 애플리케이션은 권한 부여 서버로부터 JWT 액세스 토큰을 받습니다. 이 토큰은 클라이언트 애플리케이션이 FHIR REST 요청을 HealthLake로 전송할 때 제공됩니다. 자세한 내용은 [토큰 검증](reference-smart-on-fhir-token-validation.md) 단원을 참조하십시오.

**4. FHIR 지원 HealthLake 데이터 스토어의 SMART에서 FHIR REST API 요청**  
이제 클라이언트 애플리케이션은 권한 부여 서버에서 제공하는 액세스 토큰을 사용하여 HealthLake 데이터 스토어 엔드포인트에 FHIR REST API 요청을 보낼 수 있습니다. 자세한 내용은 [SMART 지원 HealthLake 데이터 스토어에서 FHIR REST API 요청](reference-smart-on-fhir-request-example.md) 단원을 참조하십시오.

**5. JWT 액세스 토큰 검증**  
FHIR REST 요청에서 전송된 액세스 토큰을 검증하려면 Lambda 함수를 사용합니다. 자세한 내용은 [를 사용한 토큰 검증 AWS Lambda](reference-smart-on-fhir-token-validation.md) 단원을 참조하십시오.

# FHIR의 SMART에 대한 HealthLake 인증 요구 사항
<a name="reference-smart-on-fhir-authentication"></a>

FHIR 지원 HealthLake 데이터 스토어의 SMART에서 FHIR 리소스에 액세스하려면 클라이언트 애플리케이션이 OAuth 2.0 호환 권한 부여 서버의 승인을 받고 FHIR REST API 요청의 일부로 OAuth Bearer 토큰을 제시해야 합니다. 권한 부여 서버의 엔드포인트를 찾으려면 `Well-Known` Uniform Resource Identifier를 통해 FHIR Discovery Document의 HealthLake SMART를 사용합니다. 이 프로세스에 대한 자세한 내용은 섹션을 참조하세요[FHIR 검색 문서에서 SMART 가져오기](reference-smart-on-fhir-discovery-document.md).

FHIR HealthLake 데이터 스토어에서 SMART를 생성할 때는 `CreateFHIRDatastore` 요청의 `metadata` 요소에 권한 부여 서버의 엔드포인트와 토큰 엔드포인트를 정의해야 합니다. `metadata` 요소 정의에 대한 자세한 내용은 섹션을 참조하세요[HealthLake 데이터 스토어 생성](managing-data-stores-create.md).

클라이언트 애플리케이션은 권한 부여 서버 엔드포인트를 사용하여 권한 부여 서비스로 사용자를 인증합니다. 권한 부여 및 인증되면 권한 부여 서비스에서 JSON 웹 토큰(JWT)이 생성되어 클라이언트 애플리케이션으로 전달됩니다. 이 토큰에는 클라이언트 애플리케이션이 사용할 수 있는 FHIR 리소스 범위가 포함되어 있으므로 사용자가 액세스할 수 있는 데이터가 제한됩니다. 선택적으로 시작 범위가 제공된 경우 응답에 이러한 세부 정보가 포함됩니다. HealthLake에서 지원하는 SMART on FHIR 범위에 대한 자세한 내용은 섹션을 참조하세요[HealthLake에서 지원하는 FHIR OAuth 2.0 범위의 SMART](reference-smart-on-fhir-oauth-scopes.md).

클라이언트 애플리케이션은 권한 부여 서버에서 부여한 JWT를 사용하여 FHIR REST API를 FHIR 지원 HealthLake 데이터 스토어의 SMART로 호출합니다. JWT를 검증하고 디코딩하려면 Lambda 함수를 생성해야 합니다. HealthLake는 FHIR REST API 요청이 수신되면 사용자를 대신하여이 Lambda 함수를 호출합니다. 스타터 Lambda 함수 예제를 보려면 섹션을 참조하세요[를 사용한 토큰 검증 AWS Lambda](reference-smart-on-fhir-token-validation.md).

## FHIR 지원 HealthLake 데이터 스토어에서 SMART를 생성하는 데 필요한 권한 부여 서버 요소
<a name="datastore-auth-server"></a>

`CreateFHIRDatastore` 요청에서 `IdentityProviderConfiguration` 객체에 있는 `metadata` 요소의 일부로 권한 부여 엔드포인트와 토큰 엔드포인트를 제공해야 합니다. 권한 부여 엔드포인트와 토큰 엔드포인트가 모두 필요합니다. `CreateFHIRDatastore` 요청에 지정되는 방법의 예를 보려면 섹션을 참조하세요[HealthLake 데이터 스토어 생성](managing-data-stores-create.md).

## FHIR 지원 HealthLake 데이터 스토어의 SMART에서 FHIR REST API 요청을 완료하는 데 필요한 클레임
<a name="server-response"></a>

함수가 SMART on FHIR 지원 HealthLake 데이터 스토어에서 유효한 FHIR REST API 요청이 되려면 AWS Lambda 함수에 다음 클레임이 포함되어야 합니다.
+ `nbf`: [(이전 아님) 클레임](https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.5) - "nbf"(이전 아님) 클레임은 JWT가 처리에 수락되지 않아야 하는 시간을 식별합니다. "nbf" 클레임을 처리하려면 현재 날짜/시간이 "nbf" 클레임에 나열된 이전이 아닌 날짜/시간 이후이거나 같아야 합니다. 제공하는 샘플 Lambda 함수는 서버 응답`iat`에서 로 변환됩니다`nbf`.
+ `exp`: [(만료 시간) 클레임](https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.4) - "exp"(만료 시간) 클레임은 JWT가 처리에 수락되지 않아야 하는 만료 시간을 식별합니다.
+ `isAuthorized`: 로 설정된 부울입니다`True`. 권한 부여 서버에서 요청이 승인되었음을 나타냅니다.
+ `aud`: [(대상) 클레임](https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.3) - "aud"(대상) 클레임은 JWT가 의도한 수신자를 식별합니다. 이는 FHIR 지원 HealthLake 데이터 스토어 엔드포인트에서 SMART여야 합니다.
+ `scope`: 하나 이상의 FHIR 리소스 관련 범위여야 합니다. 이 범위는 권한 부여 서버에 정의되어 있습니다. HealthLake에서 허용하는 FHIR 리소스 관련 범위에 대한 자세한 내용은 섹션을 참조하세요[HealthLake의 FHIR 리소스 범위에 대한 SMART](reference-smart-on-fhir-oauth-scopes.md#smart-on-fhir-scopes-rest).

# HealthLake에서 지원하는 FHIR OAuth 2.0 범위의 SMART
<a name="reference-smart-on-fhir-oauth-scopes"></a>

HealthLake는 OAuth 2.0을 권한 부여 프로토콜로 사용합니다. 권한 부여 서버에서이 프로토콜을 사용하면 클라이언트 애플리케이션이 액세스할 수 있는 FHIR 리소스에 대한 HealthLake 데이터 스토어 권한(생성, 읽기, 업데이트, 삭제 및 검색)을 정의할 수 있습니다.

SMART on FHIR 프레임워크는 권한 부여 서버에서 요청할 수 있는 범위 집합을 정의합니다. 예를 들어, 환자가 랩 결과를 보거나 연락처 세부 정보를 볼 수 있도록 설계된 클라이언트 애플리케이션은 `read` 범위를 요청할 수 있는 *권한*만 부여해야 합니다.

**참고**  
HealthLake는 아래 설명된 대로 FHIR V1 및 V2에서 모두 SMART를 지원합니다. 데이터 스토어가 생성될 때 FHIR의 SMART[https://docs.aws.amazon.com/healthlake/latest/APIReference/API_IdentityProviderConfiguration.html#HealthLake-Type-IdentityProviderConfiguration-AuthorizationStrategy](https://docs.aws.amazon.com/healthlake/latest/APIReference/API_IdentityProviderConfiguration.html#HealthLake-Type-IdentityProviderConfiguration-AuthorizationStrategy)는 다음 세 가지 값 중 하나로 설정됩니다.  
`SMART_ON_FHIR_V1` - (읽기/검색) 및 `read` (`write`create/update/delete) 권한을 포함하는 FHIR V1의 SMART만 지원합니다.
`SMART_ON_FHIR` - , , `create`, 및 `search` 권한을 포함하는 FHIR V1 `delete`및 V2의 SMART`read``update`를 모두 지원합니다.
`AWS_AUTH` - default AWS HealthLake 권한 부여 전략으로, FHIR의 SMART와 관련이 없습니다.

## 독립 실행형 시작 범위
<a name="smart-on-fhir-scopes-launch"></a>

HealthLake는 독립 실행형 시작 모드 범위를 지원합니다`launch/patient`.

독립 실행형 시작 모드에서 클라이언트 애플리케이션은 사용자와 환자가 클라이언트 애플리케이션에 알려지지 않았기 때문에 환자의 임상 데이터에 대한 액세스를 요청합니다. 따라서 클라이언트 애플리케이션의 권한 부여 요청은 환자 범위를 반환하도록 명시적으로 요청합니다. 인증에 성공하면 권한 부여 서버는 요청된 시작 환자 범위가 포함된 액세스 토큰을 발급합니다. 필요한 환자 컨텍스트는 권한 부여 서버의 응답에서 액세스 토큰과 함께 제공됩니다.


**지원되는 시작 모드 범위**  

| Scope | 설명 | 
| --- | --- | 
| `launch/patient` | OAuth 2.0 권한 부여 요청의 파라미터로, 권한 부여 응답에서 환자 데이터를 반환하도록 요청합니다. | 

## HealthLake의 FHIR 리소스 범위에 대한 SMART
<a name="smart-on-fhir-scopes-rest"></a>

HealthLake는 FHIR 리소스 범위에서 SMART의 세 가지 수준을 정의합니다.
+ `patient` 범위는 단일 환자의 특정 데이터에 대한 액세스 권한을 부여합니다.
+ `user` 범위는 사용자가 액세스할 수 있는 특정 데이터에 대한 액세스 권한을 부여합니다.
+ `system` 범위는 HealthLake 데이터 스토어에 있는 모든 FHIR 리소스에 대한 액세스 권한을 부여합니다.

다음 섹션에서는 FHIR V1의 SMART 또는 FHIR V2의 SMART를 사용하여 FHIR 리소스 범위를 구성하는 구문을 나열합니다.

**참고**  
데이터 스토어가 생성될 때 SMART on FHIR 권한 부여 전략이 설정됩니다. 자세한 내용은 *AWS HealthLake API 참조의 섹션을 참조*[https://docs.aws.amazon.com/healthlake/latest/APIReference/API_IdentityProviderConfiguration.html#HealthLake-Type-IdentityProviderConfiguration-AuthorizationStrategy](https://docs.aws.amazon.com/healthlake/latest/APIReference/API_IdentityProviderConfiguration.html#HealthLake-Type-IdentityProviderConfiguration-AuthorizationStrategy)하세요.

### HealthLake에서 지원하는 FHIR V1 범위의 SMART
<a name="reference-smart-on-fhir-v1"></a>

FHIR V1에서 SMART를 사용하는 경우 HealthLake에 대한 FHIR 리소스 범위를 구성하기 위한 일반적인 구문은 다음과 같습니다. 다음 예제에서 전체 URL 경로를 보려면 **복사** 버튼을 스크롤합니다.

```
('patient' | 'user' | 'system') '/' (fhir-resource | '*') '.' ('read' | 'write' | '*')
```


**FHIR v1에서 지원되는 권한 부여 범위에 대한 SMART**  

| 범위 구문 | 범위 예 | 결과 | 
| --- | --- | --- | 
| `patient/(fhir-resource \| '*').('read' \| 'write' \| '*')` | patient/AllergyIntolerance.\$1 | 환자 클라이언트 애플리케이션에는 기록된 모든 알러지에 대한 인스턴스 수준의 읽기/쓰기 액세스 권한이 있습니다. | 
| `user/(fhir-resource \| '*').('read' \| 'write' \| '*')` | user/Observation.read | 사용자 클라이언트 애플리케이션에는 기록된 모든 관측치에 대한 인스턴스 수준의 읽기/쓰기 액세스 권한이 있습니다. | 
| system/('read' \$1 'write' \$1 \$1) | system/\$1.\$1 | 시스템 클라이언트 애플리케이션은 모든 FHIR 리소스 데이터에 대한 읽기/쓰기 액세스 권한이 있습니다. | 

### HealthLake에서 지원하는 FHIR V2 범위의 SMART
<a name="reference-smart-on-fhir-v2"></a>

FHIR V2에서 SMART를 사용하는 경우 HealthLake에 대한 FHIR 리소스 범위를 구성하기 위한 일반적인 구문은 다음과 같습니다. 다음 예제에서 전체 URL 경로를 보려면 **복사** 버튼을 스크롤합니다.

```
('patient' | 'user' | 'system') '/' (fhir-resource | '*') '.' ('c' | 'r' | 'u' | 'd' | 's')
```

**참고**  
FHIR V2에서 SMART를 사용하려면 [https://docs.aws.amazon.com/healthlake/latest/APIReference/API_IdentityProviderConfiguration.html](https://docs.aws.amazon.com/healthlake/latest/APIReference/API_IdentityProviderConfiguration.html) 값을 데이터 형식의 멤버인 [https://hl7.org/fhir/smart-app-launch/STU2/conformance.html#permissions](https://hl7.org/fhir/smart-app-launch/STU2/conformance.html#permissions) 메타데이터 `capabilities` 문자열에 전달해야 합니다.  
HealthLake는 세분화된 범위를 지원합니다. 자세한 내용은 *FHIR US Core 구현 안내서*에서 [지원되는 세분화된 범위를 참조하세요](https://hl7.org/fhir/us/core/scopes.html#the-following-granular-scopes-shall-be-supported).


**FHIR V2에서 지원되는 권한 부여 범위에 대한 SMART**  

| 범위 구문 | 예제 V1 범위 | 결과 | 
| --- | --- | --- | 
| `patient/Observation.rs` | user/Observation.read | 현재 환자의 Observation 리소스를 읽고 검색할 수 있는 권한. | 
| `system/*.cruds` | system/\$1.\$1 | 시스템 클라이언트 애플리케이션에는 모든 FHIR 리소스 데이터에 대한 전체 create/read/update/삭제/검색 액세스 권한이 있습니다. | 

# 를 사용한 토큰 검증 AWS Lambda
<a name="reference-smart-on-fhir-token-validation"></a>

FHIR 지원 데이터 스토어에서 HealthLake SMART를 생성할 때는 `CreateFHIRDatastore` 요청에 AWS Lambda 함수의 ARN을 제공해야 합니다. Lambda 함수의 ARN은 `IdpLambdaArn` 파라미터를 사용하여 `IdentityProviderConfiguration` 객체에 지정됩니다.

FHIR 지원 데이터 스토어에서 SMART를 생성하기 전에 Lambda 함수를 생성해야 합니다. 데이터 스토어를 생성한 후에는 Lambda ARN을 변경할 수 없습니다. 데이터 스토어가 생성될 때 지정한 Lambda ARN을 보려면 `DescribeFHIRDatastore` API 작업을 사용합니다.

**FHIR REST 요청이 FHIR 지원 데이터 스토어의 SMART에서 성공하려면 Lambda 함수가 다음을 수행해야 합니다.**
+ HealthLake 데이터 스토어 엔드포인트에 대한 응답을 1초 이내에 반환합니다.
+ 클라이언트 애플리케이션에서 보낸 REST API 요청의 권한 부여 헤더에 제공된 액세스 토큰을 디코딩합니다.
+ FHIR REST API 요청을 수행할 수 있는 충분한 권한이 있는 IAM 서비스 역할을 할당합니다.
+ FHIR REST API 요청을 완료하려면 다음 클레임이 필요합니다. 자세한 내용은 [필수 클레임](reference-smart-on-fhir-authentication.md#server-response)를 참조하세요.
  + `nbf`
  + `exp`
  + `isAuthorized`
  + `aud`
  + `scope`

Lambda로 작업할 때는 Lambda 함수 외에도 실행 역할과 리소스 기반 정책을 생성해야 합니다. Lambda 함수의 실행 역할은 함수에 런타임에 필요한 AWS 서비스 및 리소스에 액세스할 수 있는 권한을 부여하는 IAM 역할입니다. 제공하는 리소스 기반 정책은 HealthLake가 사용자를 대신하여 함수를 호출하도록 허용해야 합니다.

이 주제의 섹션에서는 클라이언트 애플리케이션의 예제 요청과 디코딩된 응답, AWS Lambda 함수를 생성하는 데 필요한 단계, HealthLake가 수임할 수 있는 리소스 기반 정책을 생성하는 방법을 설명합니다.
+ [1부: Lambda 함수 생성](#smart-on-fhir-lambda-create)
+ [2부: AWS Lambda 함수에서 사용하는 HealthLake 서비스 역할 생성](#smart-on-fhir-lambda-service-role)
+ [3부: Lambda 함수의 실행 역할 업데이트](#smart-on-fhir-lambda-service-role-execution-role)
+ [4부: Lambda 함수에 리소스 정책 추가](#smart-on-fhir-lambda-invoke-healthlake)
+ [5부: Lambda 함수에 대한 동시성 프로비저닝](#smart-on-fhir-lambda-function-scaling)

## AWS Lambda 함수 생성
<a name="smart-on-fhir-lambda-create"></a>

이 주제에서 생성된 Lambda 함수는 HealthLake가 FHIR 지원 데이터 스토어의 SMART에 대한 요청을 수신하면 트리거됩니다. 클라이언트 애플리케이션의 요청에는 REST API 호출과 액세스 토큰이 포함된 권한 부여 헤더가 포함됩니다.

```
GET https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/
Authorization: Bearer i8hweunweunweofiwweoijewiwe
```

이 주제의 Lambda 함수 예제에서는 AWS Secrets Manager 를 사용하여 권한 부여 서버와 관련된 자격 증명을 가립니다. Lambda 함수에서 직접 권한 부여 서버 로그인 세부 정보를 제공하지 않는 것이 좋습니다.

**Example 권한 부여 보유자 토큰이 포함된 FHIR REST 요청 검증**  
예제 Lambda 함수는 FHIR 지원 데이터 스토어의 SMART로 전송된 FHIR REST 요청을 검증하는 방법을 보여줍니다. 이 Lambda 함수를 구현하는 방법에 대한 step-by-steps 지침은 섹션을 참조하세요[를 사용하여 Lambda 함수 생성 AWS Management Console](#create-lambda-console).  
FHIR REST API 요청에 유효한 데이터 스토어 엔드포인트, 액세스 토큰 및 REST 작업이 포함되어 있지 않으면 Lambda 함수가 실패합니다. 필요한 권한 부여 서버 요소에 대한 자세한 내용은 섹션을 참조하세요[필수 클레임](reference-smart-on-fhir-authentication.md#server-response).  

```
import base64
import boto3
import logging
import json
import os
from urllib import request, parse

logger = logging.getLogger()
logger.setLevel(logging.INFO)

## Uses Secrets manager to gain access to the access key ID and secret access key for the authorization server
client = boto3.client('secretsmanager', region_name="region-of-datastore")
response = client.get_secret_value(SecretId='name-specified-by-customer-in-secretsmanager')
secret = json.loads(response['SecretString'])
client_id = secret['client_id']
client_secret = secret['client_secret']


unencoded_auth = f'{client_id}:{client_secret}'
headers = {
  'Authorization': f'Basic {base64.b64encode(unencoded_auth.encode()).decode()}',
  'Content-Type': 'application/x-www-form-urlencoded'
}

auth_endpoint = os.environ['auth-server-base-url'] # Base URL of the Authorization server
user_role_arn = os.environ['iam-role-arn'] # The IAM role client application will use to complete the HTTP request on the datastore

def lambda_handler(event, context):
    if 'datastoreEndpoint' not in event or 'operationName' not in event or 'bearerToken' not in event:
    return {}

    datastore_endpoint = event['datastoreEndpoint']
    operation_name = event['operationName']
    bearer_token = event['bearerToken']
    logger.info('Datastore Endpoint [{}], Operation Name: [{}]'.format(datastore_endpoint, operation_name))

    ## To validate the token
    auth_response = auth_with_provider(bearer_token)
    logger.info('Auth response: [{}]'.format(auth_response))
    auth_payload = json.loads(auth_response)
    ## Required parameters needed to be sent to the datastore endpoint for the HTTP request to go through
    auth_payload["isAuthorized"] = bool(auth_payload["active"])
    auth_payload["nbf"] = auth_payload["iat"]
    return {"authPayload": auth_payload, "iamRoleARN": user_role_arn}

## access the server
def auth_with_provider(token):
    data = {'token': token, 'token_type_hint': 'access_token'}
    req = request.Request(url=auth_endpoint + '/v1/introspect', data=parse.urlencode(data).encode(), headers=headers)
    with request.urlopen(req) as resp:
    return resp.read().decode()
```

### 를 사용하여 Lambda 함수 생성 AWS Management Console
<a name="create-lambda-console"></a>

다음 절차에서는 SMART on FHIR 지원 데이터 스토어에서 FHIR REST API 요청을 처리할 때 HealthLake가 수임할 서비스 역할을 이미 생성했다고 가정합니다. 서비스 역할을 생성하지 않은 경우에도 Lambda 함수를 생성할 수 있습니다. Lambda 함수가 작동하려면 먼저 서비스 역할의 ARN을 추가해야 합니다. 서비스 역할을 생성하고 Lambda 함수에서 지정하는 방법에 대한 자세한 내용은 섹션을 참조하세요. [JWT를 디코딩하는 데 사용되는 AWS Lambda 함수에 사용할 HealthLake 서비스 역할 생성](#smart-on-fhir-lambda-service-role) 

**Lambda 함수를 생성하려면(AWS Management Console)**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home/functions)를 엽니다.

1. **함수 생성**을 선택합니다.

1. **새로 작성**을 선택합니다.

1. **기본 정보**에서 **함수 이름을** 입력합니다. **런타임**에서 Python 기반 런타임을 선택합니다.

1. **Execution role**(실행 역할)에서 **Create a new role with basic Lambda permissions**(기본 Lambda 권한을 가진 새 역할 생성)를 선택합니다.

   Lambda는 Amazon CloudWatch에 대한 로그 업로드 권한을 함수에 부여하는 [실행 역할](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)을 생성합니다. Lambda 함수는 함수를 호출할 때 실행 역할을 수임하고 실행 역할을 사용하여 AWS SDK에 대한 자격 증명을 생성합니다.

1. **코드** 탭을 선택하고 샘플 Lambda 함수를 추가합니다.

   Lambda 함수가 사용할 서비스 역할을 아직 생성하지 않은 경우 샘플 Lambda 함수가 작동하려면 먼저 생성해야 합니다. Lambda 함수에 대한 서비스 역할 생성에 대한 자세한 내용은 섹션을 참조하세요[JWT를 디코딩하는 데 사용되는 AWS Lambda 함수에 사용할 HealthLake 서비스 역할 생성](#smart-on-fhir-lambda-service-role).

   ```
   import base64
   import boto3
   import logging
   import json
   import os
   from urllib import request, parse
   
   logger = logging.getLogger()
   logger.setLevel(logging.INFO)
   
   ## Uses Secrets manager to gain access to the access key ID and secret access key for the authorization server
   client = boto3.client('secretsmanager', region_name="region-of-datastore")
   response = client.get_secret_value(SecretId='name-specified-by-customer-in-secretsmanager')
   secret = json.loads(response['SecretString'])
   client_id = secret['client_id']
   client_secret = secret['client_secret']
   
   
   unencoded_auth = f'{client_id}:{client_secret}'
   headers = {
     'Authorization': f'Basic {base64.b64encode(unencoded_auth.encode()).decode()}',
     'Content-Type': 'application/x-www-form-urlencoded'
   }
   
   auth_endpoint = os.environ['auth-server-base-url'] # Base URL of the Authorization server
   user_role_arn = os.environ['iam-role-arn'] # The IAM role client application will use to complete the HTTP request on the datastore
   
   def lambda_handler(event, context):
       if 'datastoreEndpoint' not in event or 'operationName' not in event or 'bearerToken' not in event:
       return {}
   
       datastore_endpoint = event['datastoreEndpoint']
       operation_name = event['operationName']
       bearer_token = event['bearerToken']
       logger.info('Datastore Endpoint [{}], Operation Name: [{}]'.format(datastore_endpoint, operation_name))
   
       ## To validate the token
       auth_response = auth_with_provider(bearer_token)
       logger.info('Auth response: [{}]'.format(auth_response))
       auth_payload = json.loads(auth_response)
       ## Required parameters needed to be sent to the datastore endpoint for the HTTP request to go through
       auth_payload["isAuthorized"] = bool(auth_payload["active"])
       auth_payload["nbf"] = auth_payload["iat"]
       return {"authPayload": auth_payload, "iamRoleARN": user_role_arn}
   
   ## Access the server
   def auth_with_provider(token):
       data = {'token': token, 'token_type_hint': 'access_token'}
       req = request.Request(url=auth_endpoint + '/v1/introspect', data=parse.urlencode(data).encode(), headers=headers)
       with request.urlopen(req) as resp:
       return resp.read().decode()
   ```

### Lambda 함수의 실행 역할 수정
<a name="modify-lambda-execution-role"></a>

Lambda 함수를 생성한 후 Secrets Manager를 호출하는 데 필요한 권한을 포함하도록 실행 역할을 업데이트해야 합니다. Secrets Manager에서 생성하는 각 보안 암호에는 ARN이 있습니다. 최소 권한을 적용하려면 실행 역할에 Lambda 함수가 실행되는 데 필요한 리소스에만 액세스할 수 있어야 합니다.

IAM 콘솔에서 검색하거나 Lambda 콘솔에서 **구성을** 선택하여 Lambda 함수의 실행 역할을 수정할 수 있습니다. Lambda 함수 실행 역할 관리에 대한 자세한 내용은 섹션을 참조하세요[Lambda 실행 역할](#smart-on-fhir-lambda-service-role-execution-role).

**Example 에 대한 액세스 권한을 부여하는 Lambda 함수 실행 역할 `GetSecretValue`**  
실행 역할에 IAM 작업을 추가`GetSecretValue`하면 샘플 Lambda 함수가 작동하는 데 필요한 권한이 부여됩니다.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "secretsmanager:GetSecretValue",
            "Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:secret-name-DKodTA"
        }
    ]
}
```

이 시점에서 FHIR 지원 데이터 스토어의 SMART로 전송된 FHIR REST 요청의 일부로 제공된 액세스 토큰을 검증하는 데 사용할 수 있는 Lambda 함수를 생성했습니다.

## JWT를 디코딩하는 데 사용되는 AWS Lambda 함수에 사용할 HealthLake 서비스 역할 생성
<a name="smart-on-fhir-lambda-service-role"></a>

**페르소나: IAM 관리자**  
IAM 정책을 추가 또는 제거하고 새 IAM 자격 증명을 생성할 수 있는 사용자입니다.  

**서비스 역할**  
 서비스 역할은 서비스가 사용자를 대신하여 작업을 수행하는 것으로 가정하는 [IAM 역할](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)입니다. IAM 관리자는 IAM 내에서 서비스 역할을 생성, 수정 및 삭제할 수 있습니다. 자세한 내용은 *IAM 사용 설명서*의 [AWS 서비스 AWS에 권한을 위임할 역할 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)을 참조하세요.

JSON 웹 토큰(JWT)이 디코딩된 후 Lambda는 IAM 역할 ARN도 반환해야 합니다. 이 역할에는 REST API 요청을 수행하는 데 필요한 권한이 있어야 합니다. 그렇지 않으면 권한이 부족하여 실패합니다.

IAM을 사용하여 사용자 지정 정책을 설정할 때는 필요한 최소 권한을 부여하는 것이 가장 좋습니다. 자세한 내용은 *IAM 사용 설명서*의 [최소 권한 적용을](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege) 참조하세요.

권한 부여 Lambda 함수에서 지정할 HealthLake 서비스 역할을 생성하려면 두 단계가 필요합니다.
+ 먼저 IAM 정책을 생성해야 합니다. 정책은 권한 부여 서버에서 범위를 제공한 FHIR 리소스에 대한 액세스를 지정해야 합니다.
+ 둘째, 서비스 역할을 생성해야 합니다. 역할을 생성할 때 신뢰 관계를 지정하고 1단계에서 생성한 정책을 연결합니다. 신뢰 관계는 HealthLake를 서비스 보안 주체로 지정합니다. 이 단계에서는 HealthLake 데이터 스토어 ARN과 AWS 계정 ID를 지정해야 합니다.

### 새 IAM 정책 생성
<a name="lambda-service-role-part-1"></a>

권한 부여 서버에서 정의한 범위에 따라 인증된 사용자가 HealthLake 데이터 스토어에서 액세스할 수 있는 FHIR 리소스가 결정됩니다.

생성한 IAM 정책은 정의한 범위에 맞게 조정할 수 있습니다.

IAM 정책 설명의 `Action` 요소에 다음 작업을 정의할 수 있습니다. 테이블의 각 `Action`에 대해를 정의할 수 있습니다`Resource types`. HealthLake에서 데이터 스토어는 IAM 권한 정책 문의 `Resource` 요소에 정의할 수 있는 유일하게 지원되는 리소스 유형입니다.

개별 FHIR 리소스는 IAM 권한 정책에서 요소로 정의할 수 있는 리소스가 아닙니다.


**HealthLake에서 정의한 작업**  

| 작업 | 설명 | 액세스 레벨 | 리소스 유형(필수) | 
| --- | --- | --- | --- | 
| CreateResource | 리소스 생성 권한을 부여합니다. | 쓰기 | 데이터 스토어 ARN: arn:aws:healthlake:your-region:111122223333:datastore/fhir/your-datastore-id | 
| DeleteResource | 리소스를 삭제할 수 있는 권한을 부여합니다. | 쓰기 | 데이터 스토어 ARN: arn:aws:healthlake:your-region:111122223333:datastore/fhir/your-datastore-id | 
| ReadResource | 리소스를 읽을 수 있는 권한을 부여합니다. | 읽기 | 데이터 스토어 ARN: arn:aws:healthlake:your-region:111122223333:datastore/fhir/your-datastore-id | 
| SearchWithGet | GET 메소드로 리소스를 검색할 수 있는 권한을 부여합니다. | 읽기 | 데이터 스토어 ARN: arn:aws:healthlake:your-region:111122223333:datastore/fhir/your-datastore-id | 
| SearchWithPost | POST 메소드를 사용하여 리소스를 검색할 수 있는 권한을 부여합니다. | 읽기 | 데이터 스토어 ARN: arn:aws:healthlake:your-region:111122223333:datastore/fhir/your-datastore-id | 
| StartFHIRExportJobWithPost | GET을 사용하여 FHIR 내보내기 작업을 시작할 수 있는 권한을 부여합니다. | 쓰기 | 데이터 스토어 ARN: arn:aws:healthlake:your-region:111122223333:datastore/fhir/your-datastore-id | 
| UpdateResource | 리소스를 업데이트할 수 있는 권한을 부여합니다. | 쓰기  | 데이터 스토어 ARN: arn:aws:healthlake:your-region:111122223333:datastore/fhir/your-datastore-id | 

시작하려면를 사용할 수 있습니다`AmazonHealthLakeFullAccess`. 이 정책은 데이터 스토어에 있는 모든 FHIR 리소스에 대한 읽기, 쓰기, 검색 및 내보내기를 부여합니다. 데이터 스토어에 대한 읽기 전용 권한을 부여하려면를 사용합니다`AmazonHealthLakeReadOnlyAccess`.

 AWS Management Console AWS CLI또는 IAM SDKs를 사용하여 사용자 지정 정책을 생성하는 방법에 대한 자세한 내용은 [IAM 사용 설명서의 IAM 정책 생성을](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html) 참조하세요. ** 

### HealthLake에 대한 서비스 역할 생성(IAM 콘솔)
<a name="lambda-service-role-part-2"></a>

이 절차를 사용하여 서비스 역할을 생성합니다. 서비스를 생성할 때 IAM 정책도 지정해야 합니다.

**HealthLake에 대한 서비스 역할을 생성하려면(IAM 콘솔)**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) IAM 콘솔을 엽니다.

1. IAM 콘솔의 탐색 창에서 **역할**을 선택합니다.

1. 그런 다음 **역할 생성**을 선택합니다.

1. **신뢰 엔터티 선택** 페이지에서 **사용자 지정 신뢰 정책을** 선택합니다.

1. 그런 다음 **사용자 지정 신뢰 정책**에서 다음과 같이 샘플 정책을 업데이트합니다. **your-account-id**를 계정 번호로 바꾸고 가져오기 또는 내보내기 작업에 사용할 데이터 스토어의 ARN을 추가합니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "sts:AssumeRole",
               "Principal": {
                   "Service": "healthlake.amazonaws.com"
               },
               "Condition": {
                   "StringEquals": {
                       "aws:SourceAccount": "123456789012"
                   },
                   "ArnEquals": {
                       "aws:SourceArn": "arn:aws:healthlake:us-east-1:123456789012:datastore/fhir/your-datastore-id"
                   }
               }
           }
       ]
   }
   ```

------

1. 그리고 **다음**을 선택합니다.

1. **권한 추가** 페이지에서 HealthLake 서비스가 수임할 정책을 선택합니다. 정책을 찾으려면 **권한 정책에서 해당 정책을** 검색합니다.

1. 그런 다음 **정책 연결을** 선택합니다.

1. 그런 다음 **역할 이름** 아래의 **이름, 검토 및 생성** 페이지에서 이름을 입력합니다.

1. (선택 사항) 그런 다음 **설명**에서 역할에 대한 간단한 설명을 추가합니다.

1. 가능한 경우 이 역할의 목적을 식별하는 데 도움이 되는 역할 이름이나 역할 이름 접미사를 입력합니다. 역할 이름은 AWS 계정내에서 고유해야 합니다. 대/소문자를 구분하지 않습니다. 예를 들어, 이름이 **PRODROLE**과 **prodrole**, 두 가지로 지정된 역할을 만들 수는 없습니다. 다양한 주체가 역할을 참조할 수 있기 때문에 역할이 생성된 후에는 역할 이름을 편집할 수 없습니다.

1. 역할 세부 정보를 검토한 다음 **역할 생성을** 선택합니다.

샘플 Lambda 함수에서 역할 ARN을 지정하는 방법을 알아보려면 섹션을 참조하세요[AWS Lambda 함수 생성](#smart-on-fhir-lambda-create).

## Lambda 실행 역할
<a name="smart-on-fhir-lambda-service-role-execution-role"></a>

Lambda 함수의 실행 역할은 AWS 서비스 및 리소스에 액세스할 수 있는 권한을 함수에 부여하는 IAM 역할입니다. 이 페이지에서는 Lambda 함수의 실행 역할을 생성하고 보고 관리하는 방법에 대한 정보를 제공합니다.

기본적으로 Lambda는를 사용하여 새 Lambda 함수를 생성할 때 최소한의 권한으로 실행 역할을 생성합니다 AWS Management Console. 실행 역할에 부여된 권한을 관리하려면 *Lambda 개발자 안내서*의 [IAM 콘솔에서 실행 역할 생성을](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html#permissions-executionrole-console) 참조하세요.

이 주제에 제공된 샘플 Lambda 함수는 Secrets Manager를 사용하여 권한 부여 서버의 자격 증명을 가립니다.

생성하는 모든 IAM 역할과 마찬가지로 최소 권한 모범 사례를 따르는 것이 중요합니다. 개발 문구 중에 필요한 것 이상의 권한을 부여하는 경우가 있습니다. 모범 사례로 프로덕션 환경에 함수를 게시하기 전에 필요한 권한만 포함하도록 정책을 조정하는 것이 가장 좋습니다. 자세한 내용은 *IAM 사용 설명서*의 [최소 권한 적용을](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege) 참조하세요.

## HealthLake가 Lambda 함수를 트리거하도록 허용
<a name="smart-on-fhir-lambda-invoke-healthlake"></a>

HealthLake가 사용자를 대신하여 Lambda 함수를 호출할 수 있도록 다음을 수행해야 합니다.
+ HealthLake가 `CreateFHIRDatastore` 요청에서 호출할 Lambda 함수의 ARN과 `IdpLambdaArn` 동일하게를 설정해야 합니다.
+ HealthLake가 사용자를 대신하여 Lambda 함수를 호출할 수 있도록 허용하는 리소스 기반 정책이 필요합니다.

HealthLake가 FHIR 지원 데이터 스토어의 SMART에서 FHIR REST API 요청을 수신하면 사용자를 대신하여 데이터 스토어 생성 시 지정된 Lambda 함수를 호출할 권한이 필요합니다. HealthLake 액세스 권한을 부여하려면 리소스 기반 정책을 사용합니다. Lambda 함수에 대한 리소스 기반 정책 생성에 대한 자세한 내용은 *AWS Lambda 개발자 안내서*의 [AWS 서비스에서 Lambda 함수를 호출하도록 허용](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html#permissions-resource-serviceinvoke)을 참조하세요.

## Lambda 함수에 대한 동시성 프로비저닝
<a name="smart-on-fhir-lambda-function-scaling"></a>

**중요**  
HealthLake를 사용하려면 Lambda 함수의 최대 실행 시간이 1초(1000밀리초) 미만이어야 합니다.  
Lambda 함수가 실행 시간 제한을 초과하면 TimeOut 예외가 발생합니다.

이 예외가 발생하지 않도록 프로비저닝된 동시성을 구성하는 것이 좋습니다. 호출이 증가하기 전에 프로비저닝된 동시성을 할당하면 짧은 지연 시간으로 초기화된 인스턴스에서 모든 요청을 처리하도록 할 수 있습니다. 프로비저닝된 동시성 구성에 대한 자세한 내용은 *Lambda 개발자 안내서*의 [프로비저닝된 동시성 구성을](https://docs.aws.amazon.com/ambda/latest/dg/provisioned-concurrency.html) 참조하세요.

Lambda 함수의 평균 실행 시간을 보려면 현재 Lambda 콘솔에서 Lambda 함수의 **모니터링** 페이지를 사용합니다. 기본적으로 Lambda 콘솔은 함수 코드가 이벤트를 처리하는 데 소요되는 평균, 최소 및 최대 시간을 보여주는 **기간** 그래프를 제공합니다. Lambda 함수 모니터링에 대한 자세한 내용은 [Lambda 개발자 안내서의 Lambda 콘솔에서 함수 모니터링을](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-functions-access-metrics.html#monitoring-console-graph-types) 참조하세요. ** 

Lambda 함수에 대한 동시성을 이미 프로비저닝하고 이를 모니터링하려면 *Lambda 개발자 안내서*의 [동시성 모니터링을](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-concurrency.html) 참조하세요.

# FHIR 기반 SMART 지원 HealthLake 데이터 스토어에서 세분화된 권한 부여 사용
<a name="reference-smart-on-fhir-fine-grained-authorization"></a>

[범위](reference-smart-on-fhir-oauth-scopes.md#smart-on-fhir-scopes-rest)만으로는 요청자가 데이터 스토어에서 액세스할 권한이 있는 데이터에 대해 필요한 특정성을 제공하지 않습니다. 세분화된 권한 부여를 사용하면 FHIR 지원 HealthLake 데이터 스토어의 SMART에 대한 액세스 권한을 부여할 때 더 높은 수준의 특이도를 확보할 수 있습니다. 세분화된 권한 부여를 사용하려면 `CreateFHIRDatastore` 요청의 `IdentityProviderConfiguration` 파라미터`True`에서를 `FineGrainedAuthorizationEnabled`로 설정합니다.

세분화된 권한 부여를 활성화한 경우 권한 부여 서버는 액세스 토큰과 `id_token` 함께의 `fhirUser` 범위를 반환합니다. 이렇게 하면 클라이언트 애플리케이션에서 사용자에 대한 정보를 검색할 수 있습니다. 클라이언트 애플리케이션은 `fhirUser` 클레임을 현재 사용자를 나타내는 FHIR 리소스의 URI로 취급해야 합니다. `Patient`, `Practitioner` 또는 `RelatedPerson` 유형을 지정할 수 있습니다. 권한 부여 서버의 응답에는 사용자가 액세스할 수 있는 데이터를 정의하는 `user/` 범위도 포함됩니다. FHIR 리소스별 범위와 관련된 범위에 대해 정의된 구문을 사용합니다.

```
user/(fhir-resource | '*').('read' | 'write' | '*')
```

다음은 세분화된 권한 부여를 사용하여 데이터 액세스 관련 FHIR 리소스 유형을 추가로 지정하는 방법의 예입니다.
+ `fhirUser`가 인 경우 `Practitioner`세분화된 권한 부여에 따라 사용자가 액세스할 수 있는 환자 모음이 결정됩니다. 에 대한 액세스`fhirUser`는 환자가 일반의`fhirUser`로서를 참조하는 경우에만 허용됩니다.

  ```
  Patient.generalPractitioner : [{Reference(Practitioner)}]
  ```
+ `fhirUser`가 `Patient` 또는 이고 요청에서 참조되는 환자가 `RelatedPerson`와 다른 경우 `fhirUser`세분화된 권한 부여에 따라 요청된 환자의에 `fhirUser` 대한 액세스가 결정됩니다. 요청된 `Patient` 리소스에 지정된 관계가 있는 경우 액세스가 허용됩니다.

  ```
  Patient.link.other : {Reference(Patient|RelatedPerson)}
  ```

# FHIR 검색 문서에서 SMART 가져오기
<a name="reference-smart-on-fhir-discovery-document"></a>

SMART는 클라이언트가 HealthLake 데이터 스토어가 지원하는 권한 부여 엔드포인트 URLs 및 기능을 학습할 수 있도록 하는 검색 문서를 정의합니다. 이 정보는 클라이언트가 올바른 엔드포인트로 권한 부여 요청을 전달하고 HealthLake 데이터 스토어가 지원하는 권한 부여 요청을 구성하는 데 도움이 됩니다.

클라이언트 애플리케이션이 HealthLake에 FHIR REST 요청을 성공적으로 수행하려면 HealthLake 데이터 스토어에서 정의한 권한 부여 요구 사항을 수집해야 합니다. 이 요청이 성공하려면 보유자 토큰(권한 부여)이 필요하지 *않습니다*.

**HealthLake 데이터 스토어에 대한 검색 문서를 요청하려면**  


1. HealthLake `region` 및 `datastoreId` 값을 수집합니다. 자세한 내용은 [데이터 스토어 속성 가져오기](managing-data-stores-describe.md) 단원을 참조하십시오.

1. HealthLake `region` 및에 대해 수집된 값을 사용하여 요청에 대한 URL을 구성합니다`datastoreId`. URL의 엔드포인트`/.well-known/smart-configuration`에를 추가합니다. 다음 예제에서 전체 URL 경로를 보려면 **복사** 버튼을 스크롤합니다.

   ```
   https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/.well-known/smart-configuration
   ```

1. 서명 버전 4 서명 프로토콜과 `GET` 함께를 사용하여 요청을 보냅니다. [AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html) 전체 예제를 보려면 **복사** 버튼을 스크롤합니다.

------
#### [ curl ]

   ```
   curl --request GET \
     'https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/.well-known/smart-configuration \
     --aws-sigv4 'aws:amz:region:healthlake' \
     --user "$AWS_ACCESS_KEY_ID:$AWS_SECRET_ACCESS_KEY" \
     --header "x-amz-security-token:$AWS_SESSION_TOKEN" \
     --header 'Accept: application/json'
   ```

------

   HealthLake 데이터 스토어의 검색 문서는 데이터 스토어의 사양 및 정의된 기능과 `token_endpoint`함께 `authorization_endpoint` 및를 찾을 수 있는 JSON BLOB으로 반환됩니다.

   ```
   {
       "authorization_endpoint": "https://oidc.example.com/authorize",
       "token_endpoint": "https://oidc.example.com/oauth/token",
       "capabilities": [
           "launch-ehr",
           "client-public"
       ]
   }
   ```

   클라이언트 애플리케이션을 시작하려면 `authorization_endpoint` 및 `token_endpoint`가 모두 필요합니다.
   + **권한 부여 엔드포인트** - 클라이언트 애플리케이션 또는 사용자에게 권한을 부여하는 데 필요한 URL입니다.
   + **토큰 엔드포인트** - 클라이언트 애플리케이션이 통신하는 데 사용하는 권한 부여 서버의 엔드포인트입니다.

# SMART 지원 HealthLake 데이터 스토어에서 FHIR REST API 요청
<a name="reference-smart-on-fhir-request-example"></a>

FHIR 지원 HealthLake 데이터 스토어의 SMART에서 FHIR REST API 요청을 수행할 수 있습니다. 다음 예제에서는 권한 부여 헤더에 JWT가 포함된 클라이언트 애플리케이션의 요청과 Lambda가 응답을 디코딩하는 방법을 보여줍니다. 클라이언트 애플리케이션 요청이 승인 및 인증된 후에는 권한 부여 서버로부터 보유자 토큰을 받아야 합니다. FHIR 지원 HealthLake 데이터 스토어의 SMART에서 FHIR REST API 요청을 보낼 때 권한 부여 헤더의 보유자 토큰을 사용합니다.

```
GET https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/Patient/[ID]
Authorization: Bearer auth-server-provided-bearer-token
```

권한 부여 헤더에서 보유자 토큰이 발견되고 AWS IAM 자격 증명이 감지되지 않았기 때문에 HealthLake는 FHIR에서 SMART를 활성화한 HealthLake 데이터 스토어가 생성될 때 지정된 Lambda 함수를 호출합니다. Lambda 함수에 의해 토큰이 성공적으로 디코딩되면 다음 예제 응답이 HealthLake로 전송됩니다.

```
{
  "authPayload": {
    "iss": "https://authorization-server-endpoint/oauth2/token", # The issuer identifier of the authorization server
    "aud": "https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/", # Required, data store endpoint
    "iat": 1677115637,  # Identifies the time at which the token was issued
    "nbf": 1677115637,  # Required, the earliest time the JWT would be valid
    "exp": 1997877061,  # Required, the time at which the JWT is no longer valid
    "isAuthorized": "true",  # Required, boolean indicating the request has been authorized
    "uid": "100101",  # Unique identifier returned by the auth server
    "scope": "system/*.*" # Required, the scope of the request
  },
  "iamRoleARN": "iam-role-arn" #Required, IAM role to complete the request
}
```