Amazon SNS 메시지의 서명 확인 - Amazon Simple Notification Service

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

Amazon SNS 메시지의 서명 확인

Amazon SNS에서 HTTP 엔드포인트로 보낸 메시지의 신뢰성을 확인하기 위해 메시지 서명을 확인할 수 있습니다. 메시지의 진위 여부를 확인해야 하는 두 가지 경우가 있습니다. 첫째, Amazon SNS가 주제를 구독했다는 메시지를 HTTP 엔드포인트로 보낼 때입니다. 둘째, Subscribe 또는 Unsubscribe API 작업을 실행할 때 Amazon SNS가 HTTP 엔드포인트로 확인 메시지를 보낼 때입니다.

Amazon SNS가 보낸 메시지를 확인할 때 다음을 수행해야 합니다.

  • Amazon SNS에서 인증서를 받을 때는 항상 HTTPS를 사용합니다.

  • 인증서의 신뢰성을 확인합니다.

  • 인증서가 Amazon SNS에서 수신되었는지 확인합니다.

  • 가능한 경우, 지원되는 Amazon SNS용 AWS SDK 중 하나를 사용하여 메시지의 유효성을 검사하고 확인합니다.

  • Amazon SNS 메시지가 원하는 TopicArn에서 수신되었는지 확인합니다.

Amazon SNS는 두 가지 메시지 서명 버전을 지원합니다.

  • SignatureVersion1: Amazon SNS는 메시지의 SHA1 해시를 기반으로 서명을 생성합니다.

  • SignatureVersion1: Amazon SNS는 메시지의 SHA256 해시를 기반으로 서명을 생성합니다.

Amazon SNS 주제의 메시지 서명 버전 구성

기본적으로 Amazon SNS 주제는 SignatureVersion 1을 사용합니다. Amazon SNS 주제에 대한 해싱 알고리즘(SignatureVersion 1(SHA1) 또는 SignatureVersion 2(SHA256))을 선택하려면 SetTopicAttributes API 작업을 사용할 수 있습니다.

다음 코드 예제는 AWS CLI를 사용하여 주제 속성 SignatureVersion을 설정하는 방법을 보여줍니다.

aws sns set-topic-attributes \ --topic-arn arn:aws:sns:us-east-2:123456789012:MyTopic \ --attribute-name SignatureVersion \ --attribute-value 2
HTTP 쿼리 기반 요청을 사용할 때 Amazon SNS 메시지의 서명을 확인하려면
  1. Amazon SNS가 엔드포인트에 전송한 HTTP POST 요청 본문의 JSON 문서에서 이름/값 쌍을 추출합니다. 일부 이름/값 쌍의 값을 사용하여 서명할 문자열을 생성합니다. Amazon SNS 메시지의 서명을 확인할 때 이스케이프된 컨트롤 문자를 MessageSubject 값의 원본 문자로 변환하는 것은 무척 중요합니다. 이러한 값은 서명할 문자열의 일부로 사용 시 원본 형식이어야 합니다. JSON 문서를 분석하는 방법에 대한 자세한 내용은 1단계: Amazon SNS 메시지를 처리하도록 엔드포인트를 준비합니다.에서 확인하세요.

    SignatureVersion은 Amazon SNS에서 메시지 서명을 생성하는 데 사용하는 서명 버전을 알려줍니다. 사용자는 서명 버전에서 서명을 생성하는 방법에 따르는 요구 사항을 결정할 수 있습니다. 알림의 경우 Amazon SNS는 현재 서명 버전 12를 지원합니다. 이 섹션에서는 이러한 서명 버전을 사용하여 서명을 확인하는 단계를 제공합니다.

  2. Amazon SNS가 메시지에 서명하는데 사용한 X509 인증서를 획득합니다. SigningCertURL 값은 메시지에 대한 전자 서명을 생성하는데 사용한 X509 인증서의 위치를 나타냅니다. 이 위치에서 인증서를 검색합니다.

  3. 인증서로부터 공개 키를 추출합니다. SigningCertURL에 의해 지정된 인증서로부터의 공개 키는 메시지의 신뢰성 및 무결성을 확인하는데 사용합니다.

  4. 메시지 유형을 결정합니다. 서명할 문자열 형식은 Type 값에 의해 지정된 메시지 유형에 따릅니다.

  5. 서명할 문자열을 생성합니다. 서명할 문자열은 메시지에서 지정된 이름/값 쌍의 줄바꿈 문자로 구분된 목록입니다. 각각의 이름/값 쌍은 이름, 줄바꿈 문자, 값, 줄바꿈 문자 순으로 표기됩니다. 이름/값 쌍은 바이트, sort 순으로 나열됩니다.

    메시지 유형에 따라 서명할 문자열은 다음의 이름/값 쌍을 보유해야 합니다.

    알림

    알림 메시지는 다음의 이름/값 쌍을 포함해야 합니다.

    Message MessageId Subject (if included in the message) Timestamp TopicArn Type

    다음의 예는 Notification에 대해 서명할 문자열입니다.

    Message My Test Message MessageId 4d4dc071-ddbf-465d-bba8-08f81c89da64 Subject My subject Timestamp 2019-01-31T04:37:04.321Z TopicArn arn:aws:sns:us-east-2:123456789012:s4-MySNSTopic-1G1WEFCOXTC0P Type Notification
    SubscriptionConfirmation 및 UnsubscribeConfirmation

    SubscriptionConfirmationUnsubscribeConfirmation 메시지는 다음의 이름/값 쌍을 포함해야 합니다.

    Message MessageId SubscribeURL Timestamp Token TopicArn Type

    다음의 예는 SubscriptionConfirmation에 대해 서명할 문자열입니다.

    Message My Test Message MessageId 3d891288-136d-417f-bc05-901c108273ee SubscribeURL https://sns.us-east-2.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-east-2:123456789012:s4-MySNSTopic-1G1WEFCOXTC0P&Token=233... Timestamp 2019-01-31T19:25:13.719Z Token 233... TopicArn arn:aws:sns:us-east-2:123456789012:s4-MySNSTopic-1G1WEFCOXTC0P Type SubscriptionConfirmation
  6. Base64 형식으로부터의 Signature 값을 디코딩합니다. 메시지는 Base64로 인코딩된 Signature 값의 서명을 전송합니다. 서명 값을 계산한 서명과 비교하기 전에 Base64 형식으로부터의 Signature 값을 디코딩하여 동일한 형식을 사용하여 값을 비교해야 합니다.

  7. Amazon SNS 메시지의 파생 해시 값을 생성합니다. Amazon SNS 메시지를 서명을 생성하는데 사용한 동일한 해시 알고리즘에 정규 형식으로 제출합니다.

    1. SignatureVersion1이면 SHA1을 해시 알고리즘으로 사용합니다.

    2. SignatureVersion2이면 SHA256을 해시 알고리즘으로 사용합니다.

  8. Amazon SNS 메시지의 확인 해시 값을 생성합니다. 확인 해시 값은 공개 키 값(단계 3의)을 사용하여 Amazon SNS 메시지로 전송된 서명 암호를 푼 결과입니다.

  9. Amazon SNS 메시지의 신뢰성과 무결성을 확인합니다. 파생 해시 값(단계 7의)과 확인 해시 값(단계 8의)을 비교합니다. 값이 동일하다면 수신자는 메시지가 전송하는 동안 수정되지 않았으며 Amazon SNS에서 기원했음을 확신합니다. 값이 동일하지 않다면 수신자는 이를 신뢰하지 말아야 합니다.