기본 시스템 텍스트 JSON 직렬화의 숨겨진 위험
System.Text.Json 라이브러리는 대부분의 최신 .NET 애플리케이션에서 기본값으로 자리 잡았습니다. 효율적이고 가벼우며 ASP.NET Core에 깊이 통합되어 있기 때문입니다. 하지만 이러한 기본 설정 덕분에 사용이 간편해 보이지만, 동시에 눈에 띄지 않는 보안 위험도 존재합니다. 기본적으로 System.Text.Json 직렬화는 토큰이나 내부 식별자와 같은 민감한 데이터를 포함하는 속성을 포함하여 모든 공개 속성을 자동으로 직렬화합니다. 개발자는 종종 속도 향상을 위해 이러한 기본 설정을 사용하지만, 이로 인해 API 응답에 기밀 정보가 노출될 수 있다는 점을 간과합니다(jsonserializer).
⚠️보안에 취약한 예시이며 교육 목적으로만 사용하십시오. 실제 운영 환경에서는 사용하지 마십시오.
public class UserProfile { public string UserName { get; set; } public string Email { get; set; } public string SessionToken { get; set; } // Sensitive field } var json = JsonSerializer.Serialize(userProfile); Console.WriteLine(json); // Output: {"UserName":"alex","Email":"alex@example.com","SessionToken":"eyJhbGciOi..."} 이 jsonserializer 동작은 다음과 같은 점을 드러냅니다. 세션토큰 모든 공개 속성이 자동으로 직렬화되기 때문입니다.
보안 버전:
public class UserProfile { public string UserName { get; set; } public string Email { get; set; } [JsonIgnore] // Prevent serialization of sensitive fields public string SessionToken { get; set; } } 교육적 참고사항: 항상 사용 [JsonIgnore] 민감한 속성의 경우 직렬화에 필요한 필드만 포함하는 별도의 DTO를 설계하십시오.
JsonSerializer가 경고 없이 노출 범위를 확장하는 방법
System.Text.Json의 JsonSerializer는 표면적인 수준에서 멈추지 않습니다. 중첩된 객체, 컬렉션 및 열거형 값을 재귀적으로 탐색하여 접근 가능한 모든 것을 직렬화합니다. 명시적인 제외 조항이 없으면, 특히 내부 객체에 토큰, 식별자 또는 세션 키가 포함된 경우 중첩된 데이터 유출로 이어질 수 있습니다.
⚠️보안에 취약한 예시이며 교육 목적으로만 사용하십시오. 실제 운영 환경에서는 사용하지 마십시오.
public class AuthData { public string AccessToken { get; set; } // Sensitive } public class ApiResponse { public string Message { get; set; } public AuthData AuthInfo { get; set; } // Nested object } var json = JsonSerializer.Serialize(new ApiResponse { Message = "OK", AuthInfo = new AuthData { AccessToken = "abc123" } }); Console.WriteLine(json); // Output: {"Message":"OK","AuthInfo":{"AccessToken":"abc123"}} 중첩된 객체로 인해 시스템 텍스트 JSON 직렬화에 민감한 정보가 포함됩니다. 액세스 토큰 자동으로.
보안 버전:
public class AuthData { [JsonIgnore] // Prevent exposure of sensitive tokens public string AccessToken { get; set; } } public class ApiResponse { public string Message { get; set; } public AuthData AuthInfo { get; set; } } var options = new JsonSerializerOptions { DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault, WriteIndented = false }; var json = JsonSerializer.Serialize(apiResponse, options); 교육적 참고사항: 항상 정의하세요 JsonSerializerOptions 명시적으로 중첩된 유형을 검토하여 의도치 않은 데이터 노출이 있는지 확인합니다.
API 및 마이크로서비스의 실질적인 영향
실제 .NET 애플리케이션에서는 이러한 직렬화 위험이 배포 후까지 눈에 띄지 않는 경우가 많습니다. 자동화, DTO 재사용 및 기본 jsonserializer 동작이 결합되어 이러한 위험에 대한 노출이 증폭됩니다. 안전하지 않은 직렬화로 인해 데이터가 유출되는 일반적인 패턴:
- EF Core 엔티티를 API 응답에서 직접 재사용합니다.
인증 데이터가 포함된 직렬화된 객체를 로깅합니다. - 내부 서비스와 공공 서비스 간 공유 모델 CI/CD pipelines.
⚠️보안에 취약한 예시이며 교육 목적으로만 사용하십시오. 실제 운영 환경에서는 사용하지 마십시오.
// Logs the full object, including sensitive fields _logger.LogInformation("Response: {data}", JsonSerializer.Serialize(result)); 경우 결과 이 포함되어 있습니다 비밀번호해시 or 세션토큰이것들은 이제 여기에 저장됩니다. CI/CD 로그, 위반 최소 권한 원칙. 절대로 실제 토큰, 자격 증명 또는 내부 URL을 노출하지 마십시오. pipelines.
보안 버전:
var options = new JsonSerializerOptions { IgnoreReadOnlyProperties = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull }; // Sanitize before serialization result.SessionToken = null; _logger.LogInformation("Response: {data}", JsonSerializer.Serialize(result, options)); 교육적 참고사항: 로깅하기 전에 민감한 필드를 삭제하거나 무효화하고, 항상 안전한 방법을 사용하십시오. JsonSerializerOptions 감사 출력의 기본값입니다.
개발자를 위한 안전한 직렬화 방법
개발자는 `system.text.json`의 기본값을 보안 정책이 아닌 편의 기능으로 간주해야 합니다. 안전한 시스템 텍스트 JSON 직렬화는 애플리케이션에서 나가는 데이터를 직접 제어하는 것을 의미합니다.
실질적인 방어
- 명시적 계약을 정의하십시오: API 응답을 위해 별도의 DTO를 생성하고, EF 또는 도메인 엔티티를 직접 직렬화하지 마십시오.
- 전역 옵션을 구성합니다. JsonSerializerOptions.DefaultIgnoreCondition 속성명명정책.
- 신청 [JsonIgnore] 또는 변환기: 민감한 데이터를 숨기거나 변환합니다.
- 출력 유효성 검사: 테스트에서 실제 직렬화된 응답을 검사합니다.
- 확인 절차 자동화: 직렬화 유효성 검사를 포함하세요 CI/CD.
간편 예방 점검표
- System.Text.Json 직렬화를 사용하는 모든 클래스를 검토하세요.
- 비밀 또는 자격 증명을 표시하려면 다음을 사용하십시오. [JsonIgnore]
- 전역 안전 기본값을 정의합니다. 프로그램.cs or Startup.cs
- 로그에서 직접 직렬화를 피하십시오.
- 직렬화 노출 테스트를 포함하세요 CI/CD pipeline
교육적 참고사항: 안전한 직렬화는 복잡성을 추가하는 것이 아니라 노출을 최소화하는 것입니다. 직렬화 방식을 명시적이고 테스트 가능하게 만드세요.
자동 스캔을 통한 안전하지 않은 직렬화 탐지 – System.Text.Json
자동 스캔 CI/CD System.Text.Json 및 JsonSerializer의 위험한 사용을 감지하는 데 도움이 됩니다. 정적 분석 도구는 다음을 식별할 수 있습니다.
- 모델이 누락되었습니다 [JsonIgnore].
- DTO에 노출된 민감한 영역.
- 안전하지 않은 전역 기본값(예: 무시 조건 부족).
예시 Pipeline 체크
# Never expose real tokens, credentials, or internal URLs in pipelines - name: Run serialization security checks run: dotnet xygeni validate --rules serialization --fail-on-risk 교육적 참고사항: 통합 정적 검사 귀하의에 CI/CD 모든 빌드에서 시스템 텍스트 JSON 직렬화에 대한 일관된 제어를 보장합니다.
방법 Xygeni Code Security .NET 직렬화 보안을 강화합니다.
제니 Code Security 이 도구는 .NET에서 안전하지 않은 System.Text.Json 기본값 및 JsonSerializer의 오용을 심층적으로 감지합니다.
다음과 같은 패턴을 식별합니다.
- 민감한 필드는 기본적으로 직렬화됩니다.
- JSON 데이터의 안전하지 않은 로깅입니다.
- 누락 [JsonIgnore] 속성.
- 시스템 텍스트 JSON 직렬화 옵션이 잘못 구성되었습니다.
통합하여 제니 으로 pre-commit hooks, CI/CD pipelinePR 게이트 또는 PR 게이트를 사용하면 취약한 직렬화 패턴이 병합되기 전에 차단할 수 있습니다. 이 솔루션은 직렬화 구성 오류를 시행 가능한 보안 정책으로 전환하여 기존 DevSecOps 프로세스를 보완합니다.
참고: Xygeni와 같은 보안 도구는 직렬화 규칙을 자동으로 적용합니다. 개발자들이 감사 업무가 아닌 코드 작성에 집중할 수 있도록 해줍니다.
결론 – 개요 시스템.텍스트.JS
시스템.텍스트.JS 직렬화 속도는 빠르지만, 편리함 때문에 취약점이 숨겨지는 경우가 있습니다. 기본 system.text.json 직렬화에는 모든 공개 속성이 포함되어 내부 데이터, 토큰 또는 식별자가 유출될 가능성이 있습니다.
개발자는 다음과 같은 사항을 고려해야 합니다.
- 그들의 모델을 감사하십시오.
- [JsonIgnore] 그리고 안전 JsonSerializerOptions.
- 내부 객체의 직렬화를 피하십시오.
- 다음과 같은 도구를 사용하여 스캔을 자동화하세요 Xygeni Code Security.
기본 직렬화 방식은 개발자의 편의를 위한 것일 뿐만 아니라 잠재적인 데이터 유출 위험 요소입니다. 직렬화 방식을 명시적으로 지정하고, 출력값을 검증하며, 검사를 자동화하세요. 안전한 기본값이 항상 안전한 것은 아니기 때문입니다.






