원문 캡처 · nestenius.se
원문 캡처 · nestenius.se

ASP.NET Core의 인증·권한 부여·데이터 보호 기능을 .NET 10.0.1~10.0.13과 .NET 11 RC2 기준으로 비교한 결과, 일부 보안·안정성 수정과 새 API가 확인됐다. .NET 11은 아직 출시 전이므로 아래 내용은 RC2에 기반하며 최종 버전에서 달라질 수 있다.

인증 핸들러 변경

쿠키 인증은 ITicketStore를 사용하고 같은 HTTP 요청에서 로그아웃 직후 다시 로그인할 때 새 세션을 만든다. 이전에는 로그아웃하면서 삭제한 키로 세션을 갱신하려 했다. 이 수정은 .NET 11 RC2에 포함됐으며, ITicketStore를 사용하지 않거나 로그아웃과 로그인이 서로 다른 요청에서 이뤄지는 앱에는 해당하지 않는다. 자세한 배경은 관련 이슈와 수정 PR에서 확인할 수 있다.

로그인·로그아웃 과정에서 쿼리 문자열의 ReturnUrl에 일부 비출력 문자가 있으면 거부하는 검증은 .NET 10.0.13에 들어갔고 .NET 11 RC2에도 유지됐다. 정상적인 로컬 반환 URL은 계속 사용할 수 있다. 수정 PR과 검증 도우미 코드에 세부 내용이 있다.

Negotiate 핸들러는 .NET 11 RC2에서 TLS 채널 바인딩을 사용할 수 있게 됐다. 이는 인증 교환을 서버의 TLS 종단점에 연결하며, 인증 메커니즘이 이를 확인하면 다른 종단점으로 중계된 인증을 탐지하는 데 도움이 될 수 있다. 관련 PR에 구현 배경이 설명돼 있다. LDAP 계정·그룹 조회 수정은 .NET 10.0.13에 반영됐고 RC2에도 유지됐다. LDAP에서 가져온 역할을 사용하는 앱에서는 인증된 사용자에게 부여되는 역할이 달라질 수 있다.

인증서 인증은 .NET 10.0.13에서 캐시 키에 인증 스킴 이름을 포함하도록 수정됐다. 검증 캐싱을 켜고 이름이 다른 인증서 스킴을 여러 개 등록한 경우, 스킴별 검증 설정이나 사용자 정보가 캐시에서 분리된다. 수정은 .NET 11 RC2에도 들어갔으며 일반적인 핸들러 사용에 새 설정은 필요하지 않다. 자세한 내용은 수정 PR을 참고할 수 있다.

OpenID Connect에는 인증 콜백에서 프레임워크의 CSRF 보호 기능이 간섭하지 않도록 하는 호환성 수정이 RC2에 포함됐다(PR). JwtBearer, BearerToken, Facebook, Google, MicrosoftAccount, Twitter, WsFederation 핸들러에서는 비교한 버전 사이에 주목할 만한 공개 API 변경이 없었다. JwtBearer 검증에 쓰이는 IdentityModel 변경은 이 비교 범위에 포함되지 않았다.

권한 부여와 데이터 보호

.NET 11 RC2에는 엔드포인트 메타데이터에서 권한 정책을 조합하는 AuthorizationPolicy.CombineAsync 오버로드가 추가됐다. [Authorize] 같은 특성, 명시적으로 지정한 정책, IAuthorizationRequirementData가 제공하는 요구 사항을 함께 처리한다. 사용자에게 해당 권한이 있는지 확인하는 과정은 여전히 필요하다. 변경은 MVC, SignalR, Blazor에서 권한 메타데이터를 더 일관되게 처리하기 위한 것으로 PR에 설명돼 있다.

권한 처리기가 실패 이유를 명시적으로 제공하면 RC2부터 그 내용이 실패 로그에 나타난다. 이미 가능했던 실패 이유를 로그에 표시하는 변경이며, 그 메시지가 HTTP 응답에 추가되는 것은 아니다.

데이터 보호에는 입력을 ReadOnlySpan<byte>로 받고 결과를 IBufferWriter<byte>에 쓰는 ISpanDataProtector 인터페이스가 RC2에 추가됐다. 버퍼를 다루는 앱이나 라이브러리에서는 중간 배열과 복사를 피하는 데 도움이 될 수 있다. 기존 API는 계속 사용할 수 있고, 사용자 정의 IDataProtector 구현이 새 인터페이스를 구현해야 하는 것도 아니다. 세부 내용은 수정 PR과 API 제안을 참고할 수 있다.

데이터 보호 키 링 초기화 중 동시성 문제로 스레드 풀 고갈과 요청 지연이 발생할 수 있던 문제는 .NET 10.0.13에서 수정됐고 .NET 11 RC2에도 포함됐다. 보고된 문제와 수정 내역에서 배경을 확인할 수 있다.

RC1에서 빠진 기능과 범위

기기 바인딩 세션 자격 증명(Device Bound Session Credentials, DBSC)은 .NET 11 RC1에서 실험 패키지로 제공됐지만 RC2 전에 제거됐다. 브라우저 기기에 보관된 개인 키를 이용해 세션 갱신을 제한하는 초안 규격으로, 쿠키를 훔친 공격자가 세션을 계속 연장하기 어렵게 하는 방식이다. 규격 초안과 Chrome 문서에서 작동 방식을 확인할 수 있다.

ASP.NET Core 팀은 구현이 불완전하고 만족스럽지 않아 재작업하기로 했으며, 이후 버전에 포함될 가능성을 언급했다. RC1에서 패키지를 시험했다면 지원되는 인증 방식으로 돌아가야 한다. 제거 이유는 PR #69462, 변경 사항은 RC2 릴리스 노트, 진행 상황은 이슈 #66478에서 확인할 수 있다.

이번 비교는 인증 핸들러, 권한 부여, 데이터 보호에 한정됐다. ASP.NET Core Identity와 패스키, IdentityModel, 위조 요청 방지 기능은 다루지 않았다. 전반적으로 새 공개 API는 일부 추가됐지만, 인증과 권한 부여를 사용하는 방식이 크게 바뀐 것은 아니라는 평가다.