# 요청 연결하기 (/ko/docs/tutorials/chain-requests)

대부분의 API는 로그인하여 받은 토큰을 요구합니다. 이 튜토리얼에서는 로그인 응답에서 데모 숍의 토큰을 변수에 저장하고, 폴더의 인증으로 폴더 전체에서 토큰을 보내고,
한 응답의 값을 다음 요청으로 읽어 오고, `Idempotency-Key`로 주문을 안전하게 넣습니다.

- **소요 시간:** 15분.
- **필요한 것:** [첫 번째 작업 공간](/docs/tutorials/first-workspace)에서 만든 작업 공간. **Demo** 환경을 선택한 상태이고 **Auth › Sign in** 요청이 있어야 합니다.
  Alpenglow에는 이 모두가 이미 만들어져 있으니 열어서 비교해 볼 수 있습니다.
- **배우는 내용:** 응답 캡처, 상속된 인증, 동적 값, 응답 값.

## 1. 로그인 응답에서 토큰 저장하기 [#1-store-the-token-from-the-sign-in-response]

1. **Auth › Sign in**을 열고 보냅니다(<kbd>⌘</kbd><kbd>R</kbd>).
2. 응답의 **본문** 탭에서 보기를 **JSON 트리**로 바꿉니다.
3. `access_token` 행에 포인터를 올립니다. 값 뒤에 작은 버튼이 나타납니다. 도움말이 <strong>변수에 저장…</strong>인 버튼을 선택합니다.
4. **변수에 저장** 팝오버에서 다음과 같이 합니다.
   - 이름을 `token`으로 바꿉니다.
   - 범위에서 **“Demo” 환경**을 선택합니다. 서버마다 자체 토큰이 있기 때문입니다.
   - **비밀 값 · 키체인에 보관, 파일에는 저장 안 함**이 선택되어 있는지 확인합니다. `token` 같은 이름이면 Echolot이 직접 선택해 둡니다.
   - **보낼 때마다 업데이트 · 이 요청과 함께 저장**은 선택된 채로 둡니다.
5. **저장**을 선택합니다.

요청의 **변수** 탭을 엽니다. **응답에서** 아래에 행이 하나 있습니다. `token`, **JSON**에서, 경로 `$.access_token`, **Demo**에 저장, 비밀 값. 이제부터
**Sign in**을 성공적으로 보낼 때마다 새 토큰이 `{{token}}`에 기록됩니다. 응답이 400 이상이거나 값이 없으면 변수는 그대로 둡니다. 자세한 내용은
[응답 캡처](/docs/requests/captures)에 있습니다.

<Shot id="tutorials-chain-store-variable" alt="JSON 트리의 access_token 값 위에 열린 변수에 저장 팝오버. 범위와 비밀 체크 상자가 선택되어 있음" />

## 2. 폴더 전체에서 토큰 보내기 [#2-send-the-token-from-a-whole-folder]

모든 요청에 Bearer 인증을 설정하는 대신 폴더에 한 번만 설정합니다.

1. 폴더 `Orders`를 만듭니다(<kbd>⇧</kbd><kbd>⌘</kbd><kbd>N</kbd>).
2. <strong>Orders</strong>를 오른쪽 클릭하고 <strong>폴더 설정…</strong>을 선택합니다.
3. **인증** 탭에서 **유형**을 **Bearer 토큰**으로, **토큰**을 `{{token}}`으로 설정합니다. **완료**를 선택합니다.
4. **Orders**를 오른쪽 클릭하고 **새로운 요청**을 선택한 뒤 이름을 `List orders`로 합니다. URL을 `{{baseURL}}/orders`로 설정합니다.
5. **인증** 탭을 엽니다. **유형**은 **상속**이며, **사용** 행에 폴더의 Bearer 토큰을 사용한다고 표시됩니다.
6. 보냅니다.

Heidi의 주문 세 개가 나옵니다. `ord_7Hk2Lw`(배송 중), `ord_8Jm4Qx`(결제 완료), `ord_5Fd9Ra`(배송 완료)입니다. **Orders**의 새 요청은 모두 같은 방식으로 토큰을
보냅니다. 요청은 **상속**으로 시작하며, 가장 가까운 폴더의 인증을, 그다음 작업 공간의 인증을 사용합니다. 다른 유형은 [인증](/docs/requests/auth)을 참고하십시오.

나중에 `401 Unauthorized`가 오면 토큰이 만료된 것입니다. 토큰은 1시간 동안 유효합니다. **Sign in**을 다시 보내면 토큰이 업데이트됩니다.

## 3. 다른 응답에서 값 읽기 [#3-read-a-value-from-another-response]

다음 요청은 **List orders**의 응답에서 첫 번째 주문의 ID를 읽으므로 직접 복사할 필요가 없습니다.

1. **Orders**에 요청 `Get order`를 만듭니다.
2. URL 필드에 `{{baseURL}}/orders/`를 입력하고 이어서 `{{$response`를 입력합니다. 목록에 **응답** 그룹의 동적 값이 나타납니다. **JSONPath로 필터링한 응답**을
   선택합니다.
3. 열리는 양식에서 **요청**을 **List orders** 요청(`orders/list-orders`)으로, **JSONPath**를 `$.items[0].id`로 설정합니다. **먼저 보내기**는
   **아직 응답이 없을 때**로 둡니다. **완료**를 선택합니다.

이제 URL에는 `{{$responseJSONPath('orders/list-orders', '$.items[0].id')}}`를 나타내는 토큰이 들어 있습니다. 포인터를 올리면 현재 값 `ord_7Hk2Lw`를 볼 수
있습니다. **Get order**를 보내면 품목과 배송 정보가 포함된 해당 주문이 나옵니다. **List orders**를 한 번도 보낸 적이 없었다면 Echolot이 먼저 보냈을 것입니다.

## 4. 동적 값으로 주문하기 [#4-place-an-order-with-dynamic-values]

동적 값은 보낼 때마다 새로 만들어집니다. 새 주문에 두 가지를 사용해 봅니다.

1. **Orders**에 메서드가 **POST**이고 URL이 `{{baseURL}}/orders`인 요청 `Create order`를 만듭니다.
2. **본문** 탭에서 **JSON**을 선택하고 본문을 입력합니다. `{{` 목록으로 **ISO 8601 타임스탬프**를 삽입합니다.

   ```json
   {
     "lines": [
       { "sku": "TNT-MH-2P", "quantity": 1 },
       { "sku": "PCK-TIT-30", "quantity": 2 }
     ],
     "note": "Placed from Echolot at {{$isoTimestamp}}"
   }
   ```

3. **헤더** 탭에서 `Idempotency-Key` 헤더를 추가합니다. 값에는 `{{`를 입력하고 **UUID**(`{{$uuid}}`)를 선택합니다.
4. 보냅니다.

`/v1/orders/ord_…` 같은 `Location` 헤더가 포함된 `201 Created`가 오며, 숍은 사용자의 `Idempotency-Key`를 돌려보냅니다. note에는 보낸 시각이 들어 있습니다.
데모는 아무것도 저장하지 않으므로 새 주문은 나중에 가져올 수 없습니다. 모든 동적 값은 [레퍼런스](/docs/reference/dynamic-values)에 있습니다.

<Shot id="tutorials-chain-create-order" alt="201 Created로 응답한 Create order. 응답 헤더로 Location과 Idempotency-Key가 있음" />

## 5. Idempotency-Key의 역할 확인하기 [#5-see-what-the-idempotency-key-does]

`Idempotency-Key`는 같은 키로 보낸 요청이 같은 주문임을 서버에 알려 주므로, 다시 보내도 주문이 두 번 들어가지 않습니다.

1. **Create order**를 다시 보냅니다. `Location`의 ID가 바뀝니다. `{{$uuid}}`가 새 키를 만들었기 때문입니다.
2. **헤더** 탭에서 `{{$uuid}}`를 `tutorial-order-1` 같은 고정 값으로 바꿉니다.
3. 두 번 보냅니다. 두 응답 모두 같은 주문 ID를 담고 있습니다.

실제 API는 이 키를 사용해 첫 번째에 도달한 요청이 반복되는 것을 막습니다. Echolot도 이를 사용합니다. 유지 중이던 연결이 응답 없이 닫히면, 두 번 보내도 해가 없을
때만 새 연결로 요청을 다시 보냅니다. `GET`, `PUT`, `DELETE`와 그 밖의 안전하거나 멱등한 메서드, 그리고 `Idempotency-Key` 헤더가 있는 모든 요청이 여기에
해당합니다. 키가 없는 `POST`는 다시 보내지 않고 실패하므로, 모르는 사이에 주문이 두 번 들어가는 일은 없습니다. 끝나면 `{{$uuid}}`로 되돌려 놓으십시오.

숍이 확인하는 것이 두 가지 더 있습니다.

- 수량을 `0`으로 바꿔 보내면 `422 Unprocessable Content`가 각 품목의 문제를 나열합니다.
- Alpenglow의 **Orders with OAuth 2**는 클라이언트 자격 증명으로 토큰을 받습니다. 이 토큰은 주문을 읽을 수는 있지만 넣을 수는 없습니다. 이 토큰으로
  `POST /v1/orders`를 보내면 `403 Forbidden`으로 응답합니다.

## 다음 단계 [#next-steps]

- [API를 테스트하고 CI에서 실행하기](/docs/tutorials/test-in-ci): 검사를 추가하고 전체 체인을 한 번에 실행합니다.
- [스크립트와 테스트](/docs/requests/scripts-and-tests): 캡처로 부족할 때 쓰는 `pm.environment.set()` 등.
- [OAuth 2.0과 다른 인증 유형](/docs/requests/auth): Echolot이 토큰을 가져오고 갱신하게 합니다.
