다음을 통해 공유


액세스 키 또는 공유 액세스 서명을 사용하여 Azure Event Grid 클라이언트 인증

이 문서에서는 액세스 키 또는 SAS(공유 액세스 서명) 토큰을 사용하여 Azure Event Grid 네임스페이스 토픽, 사용자 지정 토픽, 도메인 및 파트너 네임스페이스에 클라이언트를 인증하는 방법에 대한 정보를 제공합니다.

Important

  • Microsoft Entra ID를 사용하여 사용자 또는 애플리케이션을 인증하고 권한을 부여하면 키 기반 및 SAS(공유 액세스 서명) 인증보다 뛰어난 보안과 사용 편의성을 제공합니다. Microsoft Entra ID를 사용하면 인증에 사용되는 비밀을 코드에 저장할 필요가 없으며 잠재적인 보안 취약성의 위험이 있습니다. 사용자의 애플리케이션에 Microsoft Entra ID를 사용하는 것이 좋습니다.

액세스 키를 사용하여 인증

액세스 키 인증은 가장 간단한 인증 형태입니다. 액세스 키를 HTTP 헤더 또는 URL 쿼리 매개 변수로 전달할 수 있습니다.

HTTP 헤더의 액세스 키

액세스 키를 HTTP 헤더의 aeg-sas-key 값으로 전달합니다.

aeg-sas-key: XXXXXXXXXXXXXXXXXX0GXXX/nDT4hgdEj9DpBeRr38arnnm5OFg==

쿼리 매개 변수로서의 액세스 키

aeg-sas-key를 쿼리 매개 변수로 지정할 수도 있습니다.

예를 들어, 네임스페이스 항목의 경우 HTTP 요청 URL이 키를 매개 변수로 전달하는 것처럼 보일 수 있습니다.

https://<namespace_name>.<region>.eventgrid.azure.net/topics/<topic_name>:publish?aeg-sas-key=XXXXXXXX53249XX8XXXXX0GXXX/nDT4hgdEj9DpBeRr38arnnm5OFg==

사용자 지정 항목, 도메인 및 파트너 네임스페이스의 경우 HTTP 요청 URL은 다음과 같아야 합니다.

https://<yourtopic>.<region>.eventgrid.azure.net/api/events?aeg-sas-key=XXXXXXXX53249XX8XXXXX0GXXX/nDT4hgdEj9DpBeRr38arnnm5OFg==

공유 액세스 서명

SAS(공유 액세스 서명)는 클라이언트가 통신할 수 있는 리소스에 대한 액세스 제어를 제공합니다. SAS에서 설정할 수 있는 몇 가지 컨트롤은 다음과 같습니다.

  • SAS 만료 시간을 설정합니다. 이 값은 SAS가 인증에 사용될 수 있는 유효한 간격을 효과적으로 정의합니다.
  • SAS를 사용할 수 있는 리소스입니다. SAS 토큰을 만들어 사용자 지정 항목, 도메인, 파트너 네임스페이스 및 네임스페이스에 액세스할 수 있습니다. 사용자 지정 항목, 도메인 또는 파트너 네임스페이스에 대한 SAS를 만들면 클라이언트는 이를 사용하여 해당 리소스 중 하나에 이벤트를 게시할 수 있습니다. 네임스페이스 리소스에 대한 SAS를 만들면 클라이언트가 액세스할 수 있는 항목을 세부적으로 제어할 수 있습니다. 리소스가 네임스페이스인 SAS를 만드는 경우 클라이언트는 네임스페이스 내의 모든 네임스페이스 항목에 이벤트를 게시할 수 있으며 네임스페이스 항목에 대한 모든 이벤트 구독에서 이벤트를 수신할 수 있습니다. 마찬가지로, 네임스페이스 항목에 대한 SAS를 만들면 클라이언트는 해당 네임스페이스 항목에 이벤트를 게시하고 해당 항목에 대한 모든 이벤트 구독에서 이벤트를 수신할 수 있습니다. 이벤트 구독에 대해 SAS가 만들어지면 클라이언트는 해당 이벤트 구독을 통해 이벤트를 수신할 수 있습니다.
  • 유효한 SAS를 제공하는 클라이언트만 Event Grid에 데이터를 보내거나 받을 수 있습니다.

공유 액세스 서명 토큰

클라이언트 애플리케이션이 Event Grid와 통신할 때 포함할 SAS 토큰을 생성할 수 있습니다. Event Grid 리소스에 대한 SAS 토큰은 r={resource}&e={expiration_utc}&s={signature} 형식의 URL 인코딩된 문자열입니다.

  • {resource}는 클라이언트가 액세스하는 Event Grid 리소스를 나타내는 URL입니다.
    • 사용자 지정 항목, 도메인 및 파트너 네임스페이스의 유효한 URL 형식은 https://<yourtopic>.<region>.eventgrid.azure.net/api/events입니다.
    • 네임스페이스 리소스의 유효한 형식은 다음과 같습니다.
      • 네임스페이스: https://<namespace-name>.<region>.eventgrid.azure.net
      • 네임스페이스 토픽: https://<namespace_name>.<region>.eventgrid.azure.net/topics/<topic_name>
      • 이벤트 구독: https://<namespace_name>.<region>.eventgrid.azure.net/topics/<topic_name>/eventsubscriptions/<event_subscription_name>
  • {expiration_utc}는 SAS의 URL 인코딩 UTC 만료 시간입니다.
  • {signature}는 리소스 URI를 통해 계산된 SHA-256 해시와 CRLF로 구분된 토큰 만료 순간의 문자열 표현입니다. 해시 계산은 다음 의사 코드와 유사하며 256비트/32바이트 해시 값을 반환합니다.
SHA-256('https://<namespace_name>.eventgrid.azure.net/'+'\n'+ 1438205742)

토큰에는 해시되지 않은 값이 포함되어 있으므로 수신자(Event Grid)가 동일한 매개 변수로 해시를 다시 계산하여 토큰이 수정되지 않았는지(데이터 무결성) 확인할 수 있습니다.

SAS 토큰은 서명 문자열에 사용된 리소스 URI 접두사가 붙은 모든 리소스에 대해 유효합니다.

Event Grid 사용 시 지원되는 모든 API 버전을 확인하려면 Microsoft.EventGrid 리소스 종류을 참조하세요.

SAS를 사용하여 인증

애플리케이션은 SAS 토큰을 제시하여 Event Grid 리소스보다 먼저 인증할 수 있습니다. 이는 HTTP 요청과 함께 aeg-sas-token 헤더 또는 Authorization SharedAccessSignature 헤더를 사용하여 수행할 수 있습니다. 다음 섹션에서는 SAS 토큰을 생성하는 방법과 클라이언트 애플리케이션이 이벤트를 보내거나 받기(끌어오기 배달) 위해 HTTP 요청을 할 때 이를 사용하는 방법을 설명합니다.

프로그래밍 방식으로 SAS 토큰 생성

다음 C# 및 Python 예에서는 Event Grid에 사용할 SAS 토큰을 만드는 방법을 보여 줍니다.

C# 예

static string BuildSharedAccessSignature(string resource, DateTime expirationUtc, string key)
{
    const char Resource = 'r';
    const char Expiration = 'e';
    const char Signature = 's';

    string encodedResource = HttpUtility.UrlEncode(resource);
    var culture = CultureInfo.CreateSpecificCulture("en-US");
    var encodedExpirationUtc = HttpUtility.UrlEncode(expirationUtc.ToString(culture));

    string unsignedSas = $"{Resource}={encodedResource}&{Expiration}={encodedExpirationUtc}";
    using (var hmac = new HMACSHA256(Convert.FromBase64String(key)))
    {
        string signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(unsignedSas)));
        string encodedSignature = HttpUtility.UrlEncode(signature);
        string signedSas = $"{unsignedSas}&{Signature}={encodedSignature}";

        return signedSas;
    }
}

Python 예

def generate_sas_token(uri, key, expiry=3600):
    ttl = datetime.datetime.utcnow() + datetime.timedelta(seconds=expiry)
    encoded_resource = urllib.parse.quote_plus(uri)
    encoded_expiration_utc = urllib.parse.quote_plus(ttl.isoformat())

    unsigned_sas = f'r={encoded_resource}&e={encoded_expiration_utc}'
    signature = b64encode(HMAC(b64decode(key), unsigned_sas.encode('utf-8'), sha256).digest())
    encoded_signature = urllib.parse.quote_plus(signature)
    
    token = f'r={encoded_resource}&e={encoded_expiration_utc}&s={encoded_signature}'

    return token

aeg-sas-token 헤더 사용

다음은 SAS 토큰을 aeg-sas-token 헤더의 값으로 전달하는 방법을 보여 주는 예입니다.

aeg-sas-token: r=https%3a%2f%2fmytopic.eventgrid.azure.net%2fapi%2fevents&e=6%2f15%2f2017+6%3a20%3a15+PM&s=XXXXXXXXXXXXX%2fBPjdDLOrc6THPy3tDcGHw1zP4OajQ%3d

인증 헤더 사용

이 예에서는 SAS 토큰을 Authorization 헤더의 값으로 전달하는 방법을 보여 줍니다.

Authorization: SharedAccessSignature r=https%3a%2f%2fmytopic.eventgrid.azure.net%2fapi%2fevents&e=6%2f15%2f2017+6%3a20%3a15+PM&s=XXXXXXXXXXXXX%2fBPjdDLOrc6THPy3tDcGHw1zP4OajQ%3d

다음 단계