- Startup.cs 파일 수정
수정이 필요한 주요 부분은 서비스 구성 및 미들웨어 파이프라인 설정입니다.
- 미들웨어 순서 확인
app.UseAuthentication();
app.UseAuthorization();
이 두 줄의 순서는 매우 중요합니다. 인증 처리는 반드시 권한 검사보다 먼저 이루어져야 합니다. 즉, 사용자 신원을 먼저 확인한 후, 그 사용자가 접근할 수 있는 리소스를 판단해야 하므로, 인증 후 권한 검사 순서가 맞아야 합니다.
- Swagger 설정: JWT 인증 지원 추가
다음과 같이 AddSwaggerGen 내부에 인증 관련 설정을 포함합니다:
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "MyAPI", Version = "v1" });
// XML 주석 파일 경로 설정
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
c.IncludeXmlComments(xmlPath);
#region JWT 인증 설정
// 응답 헤더 추가 필터
c.OperationFilter<AddResponseHeadersFilter>();
// 요약에 인증 정보 표시
c.OperationFilter<AppendAuthorizeToSummaryOperationFilter>();
// 요청 헤더에 토큰 전달 가능하도록 설정
c.OperationFilter<SecurityRequirementsOperationFilter>();
// OAuth2 보안 정의 (JWT)
c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
Description = "JWT 형식으로 인증을 수행합니다. 요청 헤더에 'Bearer {token}' 형태로 입력하세요. (공백 주의)",
Name = "Authorization",
In = ParameterLocation.Header,
Type = SecuritySchemeType.ApiKey,
Scheme = "Bearer"
});
#endregion
});
- JWT 인증 서비스 등록
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.SaveToken = true;
options.RequireHttpsMetadata = false;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidAudience = "https://example.com/api",
ValidIssuer = "https://example.com/api",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("StrongSecretKeyForJWTSigning1234567890"))
};
});
- 동작 효과
Swagger UI에서 각 API 엔드포인트를 확인하면, "Authorize" 버튼이 나타나며, 클릭 시 토큰 입력 창이 열립니다. 이곳에 Bearer <your_token> 형식으로 토큰을 입력하면, 이후 요청이 인증된 상태로 전송됩니다.