한 주 동안 .NET 생태계에서 있었던 주요 이슈와 아티클, 기술 트렌드를 정리해 소개합니다.
CVE-2026-40372: 공격자에게 SYSTEM 권한을 허용할 수 있는 ASP.NET Core 취약점
- 저자: SOC Prime Team
- 태그: #cve #security aspnetcore #data-protection
주요 내용
- ASP.NET Core 데이터 보호 암호화 API의 CVSS 9.1 등급 취약점
- 손상된 HMAC 검증으로 인증 자료 위조 후 SYSTEM 권한 획득 가능
- Linux/macOS 등 비Windows 운영체제에서만 작동, 특정 런타임 로딩 조건 필요
- 영향 버전 10.0.0–10.0.6, 10.0.7로 업데이트 후 데이터 보호 키링 순환 필요
- 패치 후에도 노출 기간에 발급된 토큰의 유효성 검토 필요
우연히 가장 빠른 C# CSV 파서를 만든 과정
- 저자: Bepis
- 태그: #simd #performance #csv #avx2
주요 내용
- UTF-8 ASCII 호환성을 활용한 CSV 파서 구현 과정
- SSE2, AVX2 등 SIMD 명령어와 비트 연산 단계적 적용
- 문자 인코딩(Unicode/UTF-8/UTF-16) 원리와 실제 구현 분석
- 135.305ms → 13.673ms 단계별 성능 진화 기록
- 기존 라이브러리 Sep와의 비교 및 AVX-512/ARM 플랫폼 한계 언급
C#/.NET 성능: 무엇부터 최적화해야 하나
- 저자: Chris Pietschmann
- 태그: #performance ef-core #profiling
주요 내용
- BenchmarkDotNet, dotnet-trace로 병목 측정 후 최적화하는 원칙
- DB/EF Core 쿼리, N+1 문제, 전체 엔티티 로딩 등 흔한 병목 분류
- 비동기 I/O와 Task.WhenAll 병렬화로 스레드 풀 활용
- 메모리 할당 압력, GC 오버헤드, 직렬화 비용, 캐싱 부재 분석
- 의사결정 순서: 작업 회피 → 작업량 감소 → 병렬화 → 효율화
C#/.NET: 횡단 관심사를 깔끔하게 도입하는 방법
- 저자: Chris Pietschmann
- 태그: #cross-cutting #middleware #decorator
주요 내용
- 범위, 컨텍스트, 조합 가능성 세 질문에 따른 메커니즘 선택 프레임워크
- ASP.NET 미들웨어 vs 액션 필터의 적용 기준
- 데코레이터, 제네릭 파이프라인, 도메인 서비스 패턴
- 상관관계 ID, 캐싱, 검증, 감사 로깅 구현 예시
- 안티패턴: 기본 클래스 상속 강제, 정적 헬퍼, 미들웨어 비대화
C#의 LINQ 완전 가이드 (.NET 6-9)
- 저자: Nick Cosentino
- 태그: linq #ienumerable #deferred-execution
주요 내용
- IEnumerable/IQueryable 확장 메서드, 쿼리/메서드 구문 비교
- 필터링, 프로젝션, 정렬, 그룹화, 조인, 집합 연산자 카테고리
- .NET 6-9 신규 연산자: DistinctBy, MinBy/MaxBy, Chunk, Order, CountBy, AggregateBy, Index, LeftJoin/RightJoin
- 지연 실행 동작과 ToList() 호출 시점 판단
- Feature Slicing, Plugin Architecture, CQRS 패턴과의 통합
할당에서 반복까지: .NET 컬렉션 최적화
- 저자: Gabriel Marinho
- 태그: dotnet #performance #collections
주요 내용
- List 초기 용량 지정 시 50-62% 성능 향상, 50-70% 메모리 할당 감소
- 용량 미지정 시 재할당 누적으로 10,000개 항목에서 약 20배 메모리 추가 사용
- 동적 용량 확장이 GC 압력을 3-4배 증가시키는 메커니즘
- BenchmarkDotNet 측정 결과와 .NET 소스 코드 인용 분석
- 예상 항목 수가 알려진 경우 생성자에 용량 전달하는 모범 사례
C#의 함정과 엣지 케이스 — Part 1: 기본부터 Async까지
https://medium.com/@hanxuyang0826/c-traps-edge-cases-part-1-from-basics-through-async-0b0d454a2908
주요 내용
- 값/참조 타입 기본값 처리, 컴파일 타임 vs 런타임 동작 차이
- 패턴 매칭, checked/unchecked 오버플로우, 동등성 비교 함정
- LINQ 지연 실행, First/FirstOrDefault 선택 기준
- async void 회피, .Result 블로킹 데드락, throw vs throw ex 스택 보존
- ConfigureAwait, CancellationToken 활용
C#으로 .NET GC 만들기 - Part 8: 내부 포인터
- 저자: Kevin Gosse
- 태그: #gc #internals #span
주요 내용
- Span 같은 고성능 코드의 내부 포인터(객체 시작이 아닌 내부 가리킴) 처리
- GC가 객체 시작 주소를 찾기 위한 brick table 자료구조
- 1GB 힙당 약 500KB로 빠른 조회를 제공하는 메모리 맵 기반 최적화
- brick table 기반 객체 식별 후 힙 순회 알고리즘
- GC 마킹 단계에서 brick table을 점진적으로 업데이트하는 방식
LocalStack 연대기: .NET 개발자 생존 가이드
주요 내용
- LocalStack을 사용한 .NET Lambda 로컬 개발 환경 구축 트러블슈팅
- Docker 네트워킹, PowerShell JSON 처리, .NET JIT 타임아웃 이슈
- PostgreSQL 연결 시 네임스페이스 불일치 및 타입 매핑 문제
- 28P01 인증 오류 등 실제 디버깅 사례
- 5개 장 구성의 단계별 트러블슈팅 가이드
.NET 스레드, Task, async/await 내부 동작
주요 내용
- .NET 스레드 풀의 작업자 스레드 재사용 메커니즘
- Task가 스레드가 아닌 비동기 작업의 상태 머신이라는 점
- 컴파일러가 async 메서드를 연속(continuation) 조각으로 변환하는 과정
- I/O 바운드와 CPU 바운드 작업의 스레드 사용 차이
- 동시성 vs 병렬성, 블로킹 vs 논블로킹 패턴 비교
로그가 당신에게 거짓말하고 있다: 실무용 구조화 로깅
- 저자: Mitesh Shah
- 태그: #logging #observability #serilog
주요 내용
- 메시지 템플릿 기반 구조화 로깅으로 쿼리 가능한 필드 생성
- 기록할 이벤트 분류: 요청 경계, 상태 변화, 의존성 실패, 컨텍스트 있는 오류
- 헬스체크, 성공한 작업, 전체 요청 본문, 프레임워크 노이즈 등 제거 대상
- 상관관계 ID로 서비스 간 로그 연결
- Information/Warning/Error 수준 사용 기준과 Serilog 스켈레톤 코드
고동시성 마스터: .NET 스레드 안전 설정 서비스 구축
- 저자: Mohammed Naved
- 태그: #concurrency #semaphore #cache
주요 내용
- “Thundering Herd” 문제와 더블 체크 락킹 + 세마포어 패턴
- SemaphoreSlim의 비차단 대기와 lock 대신 await를 선택하는 이유
- Fast Path/Slow Path 분리로 99.9% 요청의 동기화 오버헤드 제거
- .NET 8 환경에서의 스레드 안전 캐시 구현 코드
- Redis 기반 분산 캐시로의 확장 경로
class, record, struct, interface 중 무엇으로 만들어야 하나
- 저자: Chris Pietschmann
- 태그: csharp #type-system #records
주요 내용
- class: 참조 타입, identity 중심
- record: 값 기반 equality 자동 제공
- struct: 스택 할당 성능 최적화와 복사 의미론으로 인한 박싱 함정
- abstract/sealed/static class 변형의 사용 사례
- interface: DI 경계와 계약 추상화 정의
C#의 숨은 무기, sealed
https://medium.com/@cassio.bjhones/the-hidden-power-of-sealed-in-c-1f8fd65af315
- 저자: Cassio Jhones
- 태그: csharp #sealed #performance
주요 내용
- sealed 수정자에 의한 상속 차단과 설계 의도 표현
- JIT의 devirtualization으로 가상 호출이 직접 호출로 변환되는 동작
- 기계 코드 수준 비교를 통한 메모리 접근 단계 차이
- Entity Framework, Moq 사용 시 sealed의 제약
- “sealed by default” 원칙 채택 가이드
소프트웨어 두뇌의 한계
- 저자: Mark Downie
- 태그: ai #philosophy #software-engineering
주요 내용
- 소프트웨어 사고방식이 현실을 알고리즘과 데이터베이스로 축소시키는 경향
- 기술 전문가들이 현실을 맞추기보다 데이터베이스를 수정하려는 패턴
- AI 산업이 데이터 수집을 위해 사람들의 삶을 데이터에 맞추려는 현상
- 마케팅으로 해결되지 않는 세계관 불일치
- 두 종류의 개발자(기술 투명화 기대 vs 회의)에 대한 관찰
가벼운 읽을거리
후보 항목 중 이슈로 선정되지 않은 가벼운 읽을거리들
DataAnnotations vs FluentValidation: 하나만 고집하지 말 것
- DataAnnotations는 단순 속성 규칙과 Blazor 폼 검증, FluentValidation은 조건부·다중 속성 검증과 단위 테스트에 적합
- 선택 기준: “한 속성으로 표현 가능하면 DataAnnotations, 조건문이 필요하면 FluentValidation”
.NET 메모리 관리, 추측 그만하기
- 스택 vs 힙, 세대별 GC(Gen 0/1/2), 85KB 기준 SOH/LOH 분리와 단편화 위험
- ArrayPool를 통한 메모리 풀링으로 반복 할당 제거
.NET에서 CRON과 RRule 표현식 평가하기
- Meziantou.Framework.Scheduling 패키지로 CRON 5~7필드와 iCalendar RRule 파싱
- L(월말), W(가장 가까운 평일), #(N번째 발생) 등 고급 CRON과 RFC 5545 RRule 비교
제한된 읽기를 가진 프로세스 간 RW 락 만들기, Part 1: 세마포어
- 세마포어 기반 N개 동시 읽기 토큰과 모든 토큰을 획득하는 배타적 잠금 전략
- 타임아웃 처리와 다중 토큰 대기 시 시간 관리, 부분 획득 토큰 반환
Enum에서 Union 타입으로
- C# 15 preview의 Union 타입과 상속/enum 대비 폐쇄 집합·값 타입 의미론·nullable 추적의 차이
- 직렬화 복잡성, 학습 곡선, preview 상태 등 도입 시 고려사항
C# 패턴 매칭: 몰랐던 고급 시나리오
- 속성 패턴(중첩), 리스트 패턴, 위치 패턴, null 패턴 등 13가지 이상의 시나리오
- 사용자 데이터 필터링·요청 처리 등 비즈니스 로직에 패턴 매칭 적용한 코드 예제
