From 3e1097f58508681b5dcf72ef1ea79219278cbb7e Mon Sep 17 00:00:00 2001 From: kjh2064 Date: Mon, 29 Jun 2026 15:39:07 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20DelegatingHandler=EC=99=80=20TokenStore?= =?UTF-8?q?=EC=9D=98=20=EC=83=9D=EB=AA=85=EC=A3=BC=EA=B8=B0=20=EB=B6=88?= =?UTF-8?q?=EC=9D=BC=EC=B9=98(Scope=20Capture)=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0=EC=9D=84=20=EC=9C=84=ED=95=9C=20IServiceProv?= =?UTF-8?q?ider=20=EB=8F=99=EC=A0=81=20=ED=95=B4=EC=84=9D(Resolve)=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TaxBaik.Web/Services/TokenRefreshHandler.cs | 25 ++++++++++++--------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/TaxBaik.Web/Services/TokenRefreshHandler.cs b/TaxBaik.Web/Services/TokenRefreshHandler.cs index a7e450c..65cb762 100644 --- a/TaxBaik.Web/Services/TokenRefreshHandler.cs +++ b/TaxBaik.Web/Services/TokenRefreshHandler.cs @@ -10,12 +10,12 @@ using System.Text.Json; /// public class TokenRefreshHandler : DelegatingHandler { - private readonly ITokenStore _tokenStore; + private readonly IServiceProvider _serviceProvider; private readonly ILogger _logger; - public TokenRefreshHandler(ITokenStore tokenStore, ILogger logger) + public TokenRefreshHandler(IServiceProvider serviceProvider, ILogger logger) { - _tokenStore = tokenStore; + _serviceProvider = serviceProvider; _logger = logger; } @@ -23,10 +23,13 @@ public class TokenRefreshHandler : DelegatingHandler HttpRequestMessage request, CancellationToken cancellationToken) { + // 최신 Scoped ITokenStore 실시간 해석 (Scope Capture 차단 및 기존 Blazor 회로 수명 공유) + var tokenStore = Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(_serviceProvider); + // 요청에 access token 추가 - if (!string.IsNullOrEmpty(_tokenStore.AccessToken)) + if (!string.IsNullOrEmpty(tokenStore.AccessToken)) { - request.Headers.Authorization = new("Bearer", _tokenStore.AccessToken); + request.Headers.Authorization = new("Bearer", tokenStore.AccessToken); } var response = await base.SendAsync(request, cancellationToken); @@ -34,15 +37,15 @@ public class TokenRefreshHandler : DelegatingHandler // 401 응답이면 토큰 갱신 시도 if (response.StatusCode == HttpStatusCode.Unauthorized) { - if (!string.IsNullOrEmpty(_tokenStore.RefreshToken)) + if (!string.IsNullOrEmpty(tokenStore.RefreshToken)) { - var newTokenPair = await RefreshTokenAsync(_tokenStore.RefreshToken, request, cancellationToken); + var newTokenPair = await RefreshTokenAsync(tokenStore.RefreshToken, request, cancellationToken); if (newTokenPair != null) { // TokenStore에 토큰 저장 - _tokenStore.AccessToken = newTokenPair.AccessToken; - _tokenStore.RefreshToken = newTokenPair.RefreshToken; - _tokenStore.TokenExpiryTicks = DateTime.UtcNow.AddSeconds(newTokenPair.ExpiresIn).Ticks; + tokenStore.AccessToken = newTokenPair.AccessToken; + tokenStore.RefreshToken = newTokenPair.RefreshToken; + tokenStore.TokenExpiryTicks = DateTime.UtcNow.AddSeconds(newTokenPair.ExpiresIn).Ticks; // 새 토큰으로 재요청 request.Headers.Authorization = new("Bearer", newTokenPair.AccessToken); @@ -51,7 +54,7 @@ public class TokenRefreshHandler : DelegatingHandler else { _logger.LogWarning("토큰 갱신 실패 - 로그아웃"); - _tokenStore.Clear(); + tokenStore.Clear(); } } }