Back End/🌈 ASP.NET

Swagger UI에서 JWT 토큰 추가

James Wetzel 2025. 6. 10. 19:38

Program.cs 수정: SwaggerGen에 JWT 인증 추가

Program.cs 파일을 열고 builder.Services.AddSwaggerGen() 부분에 다음 설정을 추가합니다.

Program.cs (Swagger 인증 설정 추가)
// Program.cs
using System.Text;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models; // OpenApiSecurityScheme, OpenApiSecurityRequirement 사용을 위해 필요
using Microsoft.AspNetCore.Authorization; // 이미 있다면 생략

var builder = WebApplication.CreateBuilder(args);

// 1. 필요한 서비스 등록
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();

// -------------------------------------------------------------
// SwaggerGen 설정 수정: JWT Bearer 인증 지원 추가
// -------------------------------------------------------------
builder.Services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "My Web API", Version = "v1" });

    // JWT Bearer 인증 스킴 정의
    c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
    {
        Name = "Authorization", // 헤더 이름
        Type = SecuritySchemeType.ApiKey, // API 키 타입 (인증 스킴)
        Scheme = "Bearer", // 스킴 이름 (JWT 토큰의 접두사)
        BearerFormat = "JWT", // Bearer 포맷
        In = ParameterLocation.Header, // 토큰이 HTTP 헤더에 위치
        Description = "JWT 인증을 위한 Bearer 토큰을 입력하세요. 예: 'Bearer {token}'"
    });

    // 보호된 엔드포인트에 대한 보안 요구 사항 추가
    c.AddSecurityRequirement(new OpenApiSecurityRequirement
    {
        {
            new OpenApiSecurityScheme
            {
                Reference = new OpenApiReference
                {
                    Type = ReferenceType.SecurityScheme,
                    Id = "Bearer" // 위에서 정의한 보안 스킴의 ID
                }
            },
            new string[] {} // 이 스킴에 대한 요구 사항 (여기서는 역할 등 추가 없음)
        }
    });
});
// -------------------------------------------------------------


// 기존 JWT 설정 가져오기
var jwtSettings = builder.Configuration.GetSection("JwtSettings");
var secretKey = jwtSettings["Secret"];
if (string.IsNullOrEmpty(secretKey))
{
    throw new InvalidOperationException("JWT Secret key not found or is empty in configuration.");
}

// 인증 서비스 추가 (JWT Bearer 스킴 사용)
builder.Services
    .AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,

            ValidIssuer = jwtSettings["Issuer"],
            ValidAudience = jwtSettings["Audience"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey))
        };
    });

// 권한 부여 서비스 추가
builder.Services.AddAuthorization();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI(); // <--- Swagger UI 미들웨어
}

app.UseHttpsRedirection();

// 인증 및 권한 부여 미들웨어 파이프라인에 추가 (순서 중요!)
app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();

app.Run();

설정 설명:

  1. c.AddSecurityDefinition("Bearer", ...):
    • Swagger UI에 "Bearer"라는 이름의 보안 스킴을 정의합니다.
    • Type = SecuritySchemeType.ApiKey: 인증 타입이 API 키와 유사함을 나타냅니다 (헤더를 통해 전달).
    • Scheme = "Bearer": HTTP Authorization 헤더에서 사용할 인증 스킴이 "Bearer"임을 나타냅니다 (예: Authorization: Bearer <token>).
    • BearerFormat = "JWT": Bearer 토큰의 형식이 JWT임을 명시합니다.
    • In = ParameterLocation.Header: 이 토큰이 HTTP 요청 헤더에 위치함을 나타냅니다.
    • Name = "Authorization": 토큰이 포함될 HTTP 헤더의 이름입니다.
    • Description: Swagger UI에 표시될 설명입니다.
  2. c.AddSecurityRequirement(...):
    • API 문서에서 어떤 엔드포인트들이 이 보안 스킴을 요구하는지 Swagger UI에 알립니다.
    • Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" }: 위에서 정의한 "Bearer" 보안 스킴을 참조합니다.
    • new string[] {}: 이 스킴에 대한 특정 스코프(Scope)나 역할을 지정하는 부분입니다. JWT Bearer의 경우 일반적으로 빈 배열로 둡니다.

Swagger UI 사용 방법:

위 설정을 Program.cs에 적용하고 애플리케이션을 실행한 후, Swagger UI (https://localhost:포트번호/swagger/index.html)에 접속하면 다음과 같은 변화를 볼 수 있습니다:

  1. "Authorize" 버튼: Swagger UI 페이지 상단 또는 각 엔드포인트 옆에 "Authorize" 버튼 또는 자물쇠 아이콘이 생깁니다.
  2. 인증 대화 상자:
    • 이 "Authorize" 버튼을 클릭합니다.
    • 팝업 창이 나타나면 "Bearer" 스킴이 보이고, "Value" 입력 필드가 있을 것입니다.
    • 여기에 Bearer <복사한_JWT_토큰> 형식으로 토큰을 입력합니다. Bearer라는 접두사와 한 칸 띄우는 것(Bearer)을 잊지 마세요! 예) Bearer jwt-token
  3. 잠금 아이콘 활성화:
    • 토큰을 입력하고 "Authorize"를 클릭하면, Swagger UI 내의 각 보호된 엔드포인트 옆의 자물쇠 아이콘이 '잠김' 상태로 변경됩니다. 이는 현재 인증 상태임을 나타냅니다.
  4. 보호된 엔드포인트 테스트:
    • 이제 ProtectedController의 GET /Protected 엔드포인트를 찾아 "Try it out"을 클릭하고 "Execute"를 누르면, Swagger UI가 자동으로 Authorization: Bearer <YourToken> 헤더를 포함하여 요청을 보낼 것이고, 성공적인 응답을 받을 수 있습니다.

JWT 인증 & 권한 설정

// 인증 & 권한 속성
[Authorize]

// 모든 사용자 허용
[AllowAnonymous]
728x90
반응형