연습 - 클라우드 네이티브 애플리케이션에서 중요한 데이터 수정
주문 프로세스에 일부 로깅을 추가해야 합니다. .NET의 편집 기능을 사용하여 중요한 데이터가 로그에 유출되지 않도록 합니다.
이 연습에서는 다음을 수행합니다.
Microsoft.Extensions.Compliance.Redaction
NuGet 패키지를 각 프로젝트에 추가합니다.- 종속성 주입 컨테이너에 수정 서비스를 추가합니다.
- 로깅 프레임워크에서 수정을 사용하도록 설정합니다.
- 주문 프로세스 중에 로깅 프레임워크를 호출합니다.
- EUII 데이터에 대한 사용자 지정 수정 구현을 추가합니다.
- 분류된 데이터의 각 형식에 사용할 수정 구현을 선택합니다.
수정 서비스 추가
코드스페이스 또는 Visual Studio Code 창은 여전히 열려 있어야 합니다. 열려 있지 않으면 지금 엽니다.
터미널 창에 다음 명령을 입력합니다.
cd /workspaces/mslearn-dotnet-cloudnative/dotnet-compliance/eShopLite/Store/
Microsoft.Extensions.Compliance.Redaction
NuGet 패키지를 프로젝트에 추가합니다.dotnet add package Microsoft.Extensions.Compliance.Redaction
탐색기 창에서 dotnet-compliance/eShopLite/Store 폴더를 확장한 다음, Program.cs 파일을 선택합니다.
편집기에서 다음 종속성을 추가합니다.
using Microsoft.Extensions.Compliance.Classification; using Microsoft.Extensions.Compliance.Redaction;
줄 19까지 아래로 스크롤하고
Add redaction
주석 아래에서 종속성 주입 컨테이너에 수정 서비스를 추가합니다.builder.Services.AddRedaction();
로깅 프레임워크에서 수정 사용
편집기에서
AddRedaction()
줄 아래에 다음 코드를 추가합니다.builder.Services.AddLogging(logging => { logging.EnableRedaction(); logging.AddJsonConsole(); //Enable structure logs on the console to view the redacted data. });
위의 코드는 로깅 프레임워크에서 수정을 사용하도록 설정합니다.
주문 프로세스 중에 로깅 프레임워크를 호출합니다.
탐색기 창에서 dotnet-compliance/eShopLite/Store/Services 폴더를 확장한 다음, ProductService.cs 파일을 선택합니다.
편집기의 파일 하단에서 다음 코드를 추가합니다.
public static partial class Log { [LoggerMessage(1, LogLevel.Information, "Placed Order: {order}")] public static partial void LogOrders(this ILogger logger, [LogProperties] Order order); }
편집기의
CreateOrder
작업에서LogOrders
메서드를 호출합니다.public async Task<bool> CreateOrder(Order order) { try { _logger.LogOrders(order);
위의 코드는
LogOrders
메서드를 호출하고 현재 주문 정보를 전달합니다.
새 수정된 로깅 테스트
위의 모든 코드를 사용하여 앱은 기본 수정 구현을 통해 Order
정보를 수정할 수 있습니다. 이제 이를 테스트하겠습니다.
하단의 터미널 창에서 dotnet-compliance/eShopLite 폴더로 이동합니다.
cd ..
앱 컨테이너를 업데이트합니다.
dotnet publish /p:PublishProfile=DefaultContainer
dotnet-compliance 폴더로 이동하고 Docker로 앱을 시작합니다.
cd .. docker compose up
포트 탭을 선택한 다음, 프런트 엔드(32000) 포트에 대해 브라우저에서 열기 지구본 아이콘을 선택합니다.
제품 링크를 선택합니다. 장바구니에 일부 제품을 추가합니다.
장바구니 구매 단추를 선택합니다.
터미널 창에서 Ctrl+F를 누르고, 검색 필드에 "EventId":1,을 입력합니다.
frontend-1 | {"EventId":1,"LogLevel":"Information","Category":"Store.Services.ProductService","Message":"Placed Order: DataEntities.Order","State":{"Message":"Microsoft.Extensions.Logging.ExtendedLogger\u002BModernTagJoiner","{OriginalFormat}":"Placed Order: {order}","order.Total":209.94,"order.Products":"[\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022]","order":"DataEntities.Order","order.CustomerAddress":"","order.CustomerName":"","order.Id":""}}
이 JSON 형식의 로그 항목이 표시됩니다. order.Total 값은 로그에 있지만 CustomerName 및 CustomerAddress 값은 빈 문자열입니다.
기본적으로 수정 구현을 지정하지 않으면 수정 엔진은
ErasingRedactor
구현을 사용하여 중요한 데이터가 로그에 유출되지 않도록 합니다.터미널 창에서 Ctrl+C를 눌러 앱을 중지합니다.
사용자 지정 수정 구현 추가
이제 다른 유형의 데이터에 대해 다른 수정 알고리즘을 사용하도록 수정 구현을 향상해 보겠습니다. 먼저 값을 *****
로 대체하는 새 사용자 지정 수정 구현을 추가합니다.
탐색기 창에서 dotnet-compliance/eShopLite/DataEntities 폴더를 확장한 다음, Compliance.cs 파일을 선택합니다.
편집기의 파일 하단에서 다음 코드를 추가합니다.
public class EShopCustomRedactor : Redactor { private const string Stars = "*****"; public override int GetRedactedLength(ReadOnlySpan<char> input) => Stars.Length; public override int Redact(ReadOnlySpan<char> source, Span<char> destination) { Stars.CopyTo(destination); return Stars.Length; } }
위의 코드는 수정 엔진에서
EShopCustomRedactor
수정 메서드를 사용할 수 있도록 합니다.
사용할 수정 구현 선택
탐색기 창에서 dotnet-compliance/eShopLite/Store 폴더를 확장한 다음, Program.cs 파일을 선택합니다.
builder.Services.AddRedaction();
코드를 바꿔서 수정 엔진에 대한 구성을 제공합니다.builder.Services.AddRedaction(configure => { configure.SetRedactor<ErasingRedactor>(new DataClassificationSet(DataClassifications.EUPDataClassification)); configure.SetRedactor<EShopCustomRedactor>(new DataClassificationSet(DataClassifications.EUIIDataClassification)); });
위의 코드는 EUP 데이터에 대한
ErasingRedactor
구현과 EUII 데이터에 대한 새 사용자 지정EShopCustomRedactor
구현을 사용하도록 수정 엔진을 구성합니다.
새 수정 구현 테스트
터미널 창에서 앱을 빌드하고 실행합니다.
docker-compose up --build
포트 탭을 선택한 다음, 프런트 엔드(32000) 포트에 대해 브라우저에서 열기 지구본 아이콘을 선택합니다.
제품 링크를 선택합니다. 장바구니에 일부 제품을 추가합니다.
장바구니 구매 단추를 선택합니다.
터미널 창에서 Ctrl+F를 누르고, 검색 필드에 "EventId":1,을 입력합니다.
frontend-1 | {"EventId":1,"LogLevel":"Information","Category":"Store.Services.ProductService","Message":"Placed Order: DataEntities.Order","State":{"Message":"Microsoft.Extensions.Logging.ExtendedLogger\u002BModernTagJoiner","{OriginalFormat}":"Placed Order: {order}","order.Total":269.88,"order.Products":"[\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022]","order":"DataEntities.Order","order.CustomerAddress":"*****","order.CustomerName":"*****","order.Id":""}}
이 JSON 형식의 로그 항목이 표시됩니다. order.Id 값은 여전히 빈 문자열이지만 CustomerName 및 CustomerAddress 값은 이제
*****.
입니다.터미널 창에서 Ctrl+C를 눌러 앱을 중지합니다.