

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

# 클라이언트 액세스 토큰을 교체하여 AWS IoT 보안 터널링 연결 문제 해결
보안 터널링 연결 문제 해결

 AWS IoT 보안 터널링을 사용하는 경우 터널이 열려 있더라도 연결 문제가 발생할 수 있습니다. 다음 섹션에서는 발생할 수 있는 문제와 클라이언트 액세스 토큰을 교체하여 문제를 해결하는 방법을 보여줍니다. 클라이언트 액세스 토큰(CAT)을 교체하려면 [RotateTunnelAccessToken](https://docs.aws.amazon.com/iot/latest/apireference/API_iot-secure-tunneling_RotateTunnelAccessToken.html) API 또는 [rotate-tunnel-access-token](https://docs.aws.amazon.com/cli/latest/reference/iotsecuretunneling/rotate-tunnel-access-token.html) AWS CLI을 사용합니다. 클라이언트를 사용하면서 오류가 발생할 때의 모드가 소스 모드인지 대상 모드인지에 따라 CAT를 소스 또는 대상 모드 또는 둘 다에서 교체할 수 있습니다.

**참고**  
CAT를 소스 또는 대상 중 어디에서 교체해야 할지 확실하지 않다면 `RotateTunnelAccessToken` API를 사용할 때 `ClientMode`를 전체(ALL)로 설정하여 소스와 대상 모두에서 CAT를 교체할 수 있습니다.
CAT를 교체해도 터널 지속 시간은 연장되지 않습니다. 예를 들어, 터널 지속 시간이 12시간이고 터널이 이미 4시간 동안 열려 있었다고 가정합시다. 액세스 토큰을 교체할 때 생성된 새 토큰은 남은 8시간 동안만 사용할 수 있습니다.

**Topics**
+ [

## 잘못된 클라이언트 액세스 토큰 오류
](#invalid-access-token)
+ [

## 클라이언트 토큰 불일치 오류
](#client-token-mismatch)
+ [

## 원격 디바이스 연결 문제
](#tunnel-open-device-error)

## 잘못된 클라이언트 액세스 토큰 오류


 AWS IoT 보안 터널링을 사용하는 경우 동일한 클라이언트 액세스 토큰(CAT)을 사용하여 동일한 터널에 다시 연결할 때 연결 오류가 발생할 수 있습니다. 이 경우 로컬 프록시는 보안 터널링 프록시 서버에 연결할 수 없습니다. 소스 모드에서 클라이언트를 사용할 경우 다음 오류 메시지가 표시될 수 있습니다.

```
Invalid access token: The access token was previously used and cannot be used again
```

오류가 발생하는 이유는 클라이언트 액세스 토큰(CAT)이 로컬 프록시에 의해 한 번만 사용될 수 있고 그 후에는 무효화되기 때문입니다. 이 오류를 해결하려면 `SOURCE` 모드에서 클라이언트 액세스 토큰을 교체하여 소스에 대한 새로운 CAT를 생성하세요. 소스 CAT 교체 방법의 예를 보려면 [소스 CAT 교체 예시](#rotate-token-source-example) 섹션을 참조하세요.

## 클라이언트 토큰 불일치 오류


**참고**  
클라이언트 토큰을 사용하여 CAT를 재사용하는 것은 권장되지 않습니다. 터널에 다시 연결하기 위해 `RotateTunnelAccessToken` API를 사용하여 클라이언트 액세스 토큰을 교체하는 것이 좋습니다.

클라이언트 토큰을 사용하는 경우 터널에 다시 연결하기 위해 CAT를 재사용할 수 있습니다. CAT를 재사용하려면 보안 터널링에 처음 연결할 때 CAT와 클라이언트 토큰을 제공해야 합니다. 보안 터널링은 클라이언트 토큰을 저장하므로 동일한 토큰을 사용한 후속 연결을 시도할 경우 클라이언트 토큰도 제공해야 합니다. 클라이언트 토큰 사용에 대한 자세한 내용은 [GitHub의 로컬 프록시 참조 구현](https://github.com/aws-samples/aws-iot-securetunneling-localproxy/blob/master/V2WebSocketProtocolGuide.md)을 참조하세요.

클라이언트 토큰을 사용할 때 소스 모드에서 클라이언트를 사용할 경우 다음 오류 메시지가 표시될 수 있습니다.

```
Invalid client token: The provided client token does not match the client token 
				that was previously set.
```

오류가 발생하는 이유는 제공된 클라이언트 토큰이 터널에 액세스할 때 CAT와 함께 제공된 클라이언트 토큰과 일치하지 않기 때문입니다. 이 오류를 해결하려면 `SOURCE` 모드에서 CAT를 교체하여 소스에 대한 새로운 CAT를 생성하세요. 다음은 그 한 예입니다.

### 소스 CAT 교체 예시


다음 예시는 `SOURCE` 모드에서 `RotateTunnelAccessToken` API를 실행하여 소스에 대해 새로운 CAT를 생성하는 방법을 보여줍니다.

```
aws iotsecuretunneling rotate-tunnel-access-token \ 
    --region <region> \ 
    --tunnel-id <tunnel-id> \ 
    --client-mode SOURCE
```

이 명령을 실행하면 새 소스 액세스 토큰이 생성되고 터널의 ARN이 반환됩니다.

```
{
    "sourceAccessToken": "<source-access-token>", 
    "tunnelArn": "arn:aws:iot:<region>:<account-id>:tunnel/<tunnel-id>"
}
```

이제 새 소스 토큰을 사용하여 소스 모드에서 로컬 프록시를 연결할 수 있습니다.

```
export AWSIOT_TUNNEL_ACCESS_TOKEN=<source-access-token>
./localproxy -r <region> -s <port>
```

다음은 로컬 프록시를 실행하는 샘플 출력을 보여줍니다.

```
...

[info]    Starting proxy in source mode
...
[info]    Successfully established websocket connection with proxy server ...
[info]    Listening for new connection on port <port>
...
```

## 원격 디바이스 연결 문제


 AWS IoT 보안 터널링을 사용하는 경우 터널이 열려 있더라도 디바이스가 예기치 않게 연결 해제될 수 있습니다. 디바이스가 여전히 터널에 연결되어 있는지 확인하려면 [ DescribeTunnel](https://docs.aws.amazon.com/iot/latest/apireference/API_iot-secure-tunneling_DescribeTunnel.html) API 또는 [describe-tunnel](https://docs.aws.amazon.com/cli/latest/reference/iotsecuretunneling/describe-tunnel.html) AWS CLI을 사용할 수 있습니다.

여러 가지 이유로 디바이스의 연결이 끊어질 수 있습니다. 연결 문제를 해결하려면 다음과 같은 이유로 디바이스의 연결이 끊어진 경우 대상에서 CAT를 교체하면 됩니다.
+ 대상의 CAT가 무효화되었습니다.
+ 토큰이 보안 터널링 예약 MQTT 주제를 통해 디바이스에 전달되지 않았습니다.

  `$aws/things/<thing-name>/tunnels/notify`

다음 예에서는 이 문제를 해결하는 방법을 보여줍니다.

### 대상 CAT 교체 예시


원격 디바이스인 `<RemoteThing1>`을 예로 들어보겠습니다. 이 사물에 대해 터널을 열려면 다음 명령을 사용할 수 있습니다.

```
aws iotsecuretunneling open-tunnel \ 
    --region <region> \ 
    --destination-config thingName=<RemoteThing1>,services=SSH
```

이 명령을 실행하면 소스 및 대상에 대한 터널 세부 정보와 CAT가 생성됩니다.

```
{
    "sourceAccessToken": "<source-access-token>", 
    "destinationAccessToken": "<destination-access-token>", 
    "tunnelId": "<tunnel-id>", 
    "tunnelArn": "arn:aws:iot:<region>:<account-id>:tunnel/tunnel-id"
}
```

그러나 [DescribeTunnel](https://docs.aws.amazon.com/iot/latest/apireference/API_iot-secure-tunneling_DescribeTunnel.html) API를 사용할 경우 출력은 아래와 같이 디바이스의 연결이 끊어졌음을 나타냅니다.

```
aws iotsecuretunneling describe-tunnel \ 
    --tunnel-id <tunnel-id> \ 
    --region <region>
```

이 명령을 실행하면 디바이스가 아직 연결되어 있지 않음을 표시합니다.

```
{
    "tunnel": {
        ...
        "destinationConnectionState": {
            "status": "DISCONNECTED"
        },
        ...
    }
}
```

이 오류를 해결하려면 클라이언트는 `DESTINATION` 모드로 설정한 상태에서 `RotateTunnelAccessToken` API와 대상에 대한 구성을 실행합니다. 이 명령을 실행하면 이전 액세스 토큰이 취소되고 새 토큰이 생성되며 이 토큰을 MQTT 주제로 다시 보냅니다.

`$aws/things/<thing-name>/tunnels/notify`

```
aws iotsecuretunneling rotate-tunnel-access-token \ 
    --tunnel-id <tunnel-id> \ 
    --client-mode DESTINATION \ 
    --destination-config thingName=<RemoteThing1>,services=SSH \ 
    --region <region>
```

이 명령을 실행하면 아래와 같이 새 액세스 토큰이 생성됩니다. 그런 다음 디바이스 에이전트가 올바르게 설정된 경우 토큰이 디바이스에 전달되어 터널에 연결됩니다.

```
{
    "destinationAccessToken": "destination-access-token", 
    "tunnelArn": "arn:aws:iot:region:account-id:tunnel/tunnel-id"
}
```