쪽지발송 성공
Click here
재능넷 이용방법
재능넷 이용방법 동영상편
가입인사 이벤트
판매 수수료 안내
안전거래 TIP
재능인 인증서 발급안내

🌲 지식인의 숲 🌲

🌳 디자인
🌳 음악/영상
🌳 문서작성
🌳 번역/외국어
🌳 프로그램개발
🌳 마케팅/비즈니스
🌳 생활서비스
🌳 철학
🌳 과학
🌳 수학
🌳 역사
해당 지식과 관련있는 인기재능

안녕하세요.신호처리를 전공한 개발자 입니다. 1. 영상신호처리, 생체신호처리 알고리즘 개발2. 안드로이드 앱 개발 3. 윈도우 프로그램...

 안녕하세요. 안드로이드 기반 개인 앱, 프로젝트용 앱부터 그 이상 기능이 추가된 앱까지 제작해 드립니다.  - 앱 개발 툴: 안드로이드...

소개안드로이드 기반 어플리케이션 개발 후 서비스를 하고 있으며 스타트업 경험을 통한 앱 및 서버, 관리자 페이지 개발 경험을 가지고 있습니다....

웹 & 안드로이드 5년차입니다. 프로젝트 소스 + 프로젝트 소스 주석 +  퍼포먼스 설명 및 로직 설명 +  보이스톡 강의 + 실시간 피...

기업용 C# 애플리케이션의 사용자 인증 및 권한 관리 구현

2024-09-25 21:21:49

재능넷
조회수 680 댓글수 0

기업용 C# 애플리케이션의 사용자 인증 및 권한 관리 구현 🔐

 

 

안녕하세요, 개발자 여러분! 오늘은 기업용 C# 애플리케이션에서 매우 중요한 주제인 사용자 인증과 권한 관리 구현에 대해 자세히 알아보겠습니다. 이 글을 통해 여러분은 안전하고 효율적인 인증 시스템을 구축하는 방법을 배우게 될 것입니다. 🚀

기업용 애플리케이션에서 보안은 절대 간과할 수 없는 요소입니다. 특히 사용자 인증과 권한 관리는 데이터 보호와 시스템 안정성 유지에 핵심적인 역할을 합니다. C#을 사용하여 이러한 시스템을 구현하는 방법을 단계별로 살펴보겠습니다.

💡 참고: 이 글은 재능넷(https://www.jaenung.net)의 '지식인의 숲' 메뉴에 등록되는 콘텐츠입니다. 재능넷은 다양한 분야의 전문가들이 지식과 경험을 공유하는 플랫폼으로, 프로그래밍부터 디자인까지 폭넓은 주제를 다루고 있습니다.

1. 사용자 인증의 기본 개념 🔑

사용자 인증은 시스템에 접근하려는 사용자의 신원을 확인하는 과정입니다. 이는 보안의 첫 번째 방어선으로, 올바른 구현이 매우 중요합니다.

1.1 인증 방식의 종류

  • 아이디/비밀번호 인증: 가장 기본적인 인증 방식
  • 토큰 기반 인증: JWT(JSON Web Token) 등을 사용
  • OAuth: 외부 서비스를 통한 인증
  • 생체 인증: 지문, 얼굴 인식 등
  • 2단계 인증: 추가적인 보안 계층 제공

1.2 C#에서의 기본적인 인증 구현

C#에서는 ASP.NET Identity를 사용하여 기본적인 인증 시스템을 쉽게 구현할 수 있습니다. 다음은 간단한 예시 코드입니다:


using Microsoft.AspNetCore.Identity;

public class ApplicationUser : IdentityUser
{
    // 추가적인 사용자 속성
}

public class ApplicationDbContext : IdentityDbContext<applicationuser>
{
    public ApplicationDbContext(DbContextOptions<applicationdbcontext> options)
        : base(options)
    {
    }
}

// Startup.cs에서
public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<applicationdbcontext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<applicationuser identityrole>()
        .AddEntityFrameworkStores<applicationdbcontext>()
        .AddDefaultTokenProviders();
}
</applicationdbcontext></applicationuser></applicationdbcontext></applicationdbcontext></applicationuser>

이 코드는 ASP.NET Identity를 설정하고, 사용자 모델과 데이터베이스 컨텍스트를 정의합니다. 🛠️

2. 권한 관리 시스템 설계 👮‍♂️

권한 관리는 인증된 사용자가 시스템 내에서 어떤 작업을 수행할 수 있는지 결정하는 프로세스입니다. 효과적인 권한 관리 시스템은 보안을 강화하고 사용자 경험을 개선합니다.

2.1 역할 기반 접근 제어 (RBAC)

RBAC는 사용자에게 특정 역할을 할당하고, 각 역할에 따라 권한을 부여하는 방식입니다. C#에서는 ASP.NET Core Identity를 사용하여 RBAC를 구현할 수 있습니다.

역할 기반 접근 제어 (RBAC) 구조 사용자 관리자 일반 사용자 게스트 모더레이터

RBAC 구현을 위한 C# 코드 예시:


public class RoleController : Controller
{
    private readonly RoleManager<identityrole> _roleManager;
    private readonly UserManager<applicationuser> _userManager;

    public RoleController(RoleManager<identityrole> roleManager, UserManager<applicationuser> userManager)
    {
        _roleManager = roleManager;
        _userManager = userManager;
    }

    [HttpPost]
    public async Task<iactionresult> CreateRole(string roleName)
    {
        if (!string.IsNullOrWhiteSpace(roleName))
        {
            await _roleManager.CreateAsync(new IdentityRole(roleName));
        }
        return RedirectToAction("Index");
    }

    [HttpPost]
    public async Task<iactionresult> AddUserToRole(string userId, string roleName)
    {
        var user = await _userManager.FindByIdAsync(userId);
        if (user != null)
        {
            await _userManager.AddToRoleAsync(user, roleName);
        }
        return RedirectToAction("Index");
    }
}
</iactionresult></iactionresult></applicationuser></identityrole></applicationuser></identityrole>

이 코드는 새로운 역할을 생성하고 사용자에게 역할을 할당하는 기능을 제공합니다. 🎭

2.2 세분화된 권한 제어

때로는 역할 기반 접근 제어보다 더 세분화된 권한 제어가 필요할 수 있습니다. 이를 위해 사용자 정의 권한 시스템을 구현할 수 있습니다.

🔍 팁: 세분화된 권한 제어를 구현할 때는 성능과 관리의 용이성을 고려해야 합니다. 너무 복잡한 시스템은 유지보수가 어려울 수 있습니다.

다음은 사용자 정의 권한 시스템의 간단한 예시입니다:


public class Permission
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}

public class UserPermission
{
    public int UserId { get; set; }
    public int PermissionId { get; set; }
}

public class PermissionService
{
    private readonly ApplicationDbContext _context;

    public PermissionService(ApplicationDbContext context)
    {
        _context = context;
    }

    public async Task<bool> HasPermissionAsync(int userId, string permissionName)
    {
        var permission = await _context.Permissions
            .FirstOrDefaultAsync(p => p.Name == permissionName);

        if (permission == null)
            return false;

        return await _context.UserPermissions
            .AnyAsync(up => up.UserId == userId && up.PermissionId == permission.Id);
    }
}
</bool>

이 코드는 사용자별로 특정 권한을 부여하고 확인할 수 있는 기능을 제공합니다. 🔐

3. 보안 강화 기법 🛡️

사용자 인증과 권한 관리를 구현한 후에는 추가적인 보안 강화 기법을 적용하여 시스템의 안전성을 높일 수 있습니다.

3.1 비밀번호 해싱

사용자의 비밀번호는 절대 평문으로 저장해서는 안 됩니다. C#에서는 BCryptPBKDF2와 같은 강력한 해싱 알고리즘을 사용할 수 있습니다.


public class PasswordHasher
{
    public string HashPassword(string password)
    {
        return BCrypt.Net.BCrypt.HashPassword(password);
    }

    public bool VerifyPassword(string password, string hashedPassword)
    {
        return BCrypt.Net.BCrypt.Verify(password, hashedPassword);
    }
}

3.2 SSL/TLS 암호화

모든 통신은 SSL/TLS를 통해 암호화되어야 합니다. ASP.NET Core에서는 다음과 같이 HTTPS를 강제할 수 있습니다:


public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseHttpsRedirection();
    app.UseHsts();
    // 기타 미들웨어 설정...
}

3.3 CSRF(Cross-Site Request Forgery) 방지

CSRF 공격을 방지하기 위해 ASP.NET Core의 내장 기능을 사용할 수 있습니다:


public void ConfigureServices(IServiceCollection services)
{
    services.AddAntiforgery(options => options.HeaderName = "X-XSRF-TOKEN");
    // 기타 서비스 설정...
}

[ValidateAntiForgeryToken]
public IActionResult SensitiveAction()
{
    // 보안이 필요한 액션 로직
}

3.4 로깅과 모니터링

보안 이벤트를 로깅하고 모니터링하는 것은 매우 중요합니다. C#에서는 SerilogNLog와 같은 라이브러리를 사용할 수 있습니다.


public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    Log.Logger = new LoggerConfiguration()
        .WriteTo.File("log-.txt", rollingInterval: RollingInterval.Day)
        .CreateLogger();

    // 기타 설정...

    app.Use(async (context, next) =>
    {
        Log.Information("Request {method} {url} => {statusCode}",
            context.Request?.Method,
            context.Request?.Path.Value,
            context.Response?.StatusCode);

        await next();
    });
}

이러한 보안 강화 기법들을 적용하면 애플리케이션의 전반적인 보안 수준을 크게 향상시킬 수 있습니다. 🔒

4. 인증 및 권한 관리의 모범 사례 📚

기업용 C# 애플리케이션에서 인증 및 권한 관리를 구현할 때 고려해야 할 몇 가지 모범 사례를 살펴보겠습니다.

4.1 최소 권한 원칙

사용자에게는 필요한 최소한의 권한만을 부여해야 합니다. 이는 보안 사고의 영향을 최소화하는 데 도움이 됩니다.

최소 권한 원칙 다이어그램 핵심 권한 확장 권한 일반 권한 기본 권한

4.2 정기적인 권한 검토

사용자의 권한을 정기적으로 검토하고 필요 없는 권한은 제거해야 합니다. 이를 위한 자동화된 시스템을 구축하는 것이 좋습니다.


public class PermissionReviewService
{
    private readonly ApplicationDbContext _context;
    private readonly UserManager<applicationuser> _userManager;

    public PermissionReviewService(ApplicationDbContext context, UserManager<applicationuser> userManager)
    {
        _context = context;
        _userManager = userManager;
    }

    public async Task ReviewUserPermissions(int userId)
    {
        var user = await _userManager.FindByIdAsync(userId.ToString());
        var userRoles = await _userManager.GetRolesAsync(user);

        foreach (var role in userRoles)
        {
            if (!await IsRoleStillRequired(user, role))
            {
                await _userManager.RemoveFromRoleAsync(user, role);
            }
        }
    }

    private async Task<bool> IsRoleStillRequired(ApplicationUser user, string role)
    {
        // 역할이 여전히 필요한지 확인하는 로직
        // 예: 사용자의 직무, 최근 활동 등을 검토
        return true; // 임시 반환값
    }
}
</bool></applicationuser></applicationuser>

4.3 다단계 인증 (MFA) 구현

중요한 작업이나 민감한 데이터에 접근할 때는 다단계 인증을 요구하는 것이 좋습니다. ASP.NET Core Identity에서는 기본적인 2단계 인증을 지원합니다.


public class AccountController : Controller
{
    private readonly UserManager<applicationuser> _userManager;
    private readonly SignInManager<applicationuser> _signInManager;

    public AccountController(UserManager<applicationuser> userManager, SignInManager<applicationuser> signInManager)
    {
        _userManager = userManager;
        _signInManager = signInManager;
    }

    [HttpPost]
    public async Task<iactionresult> EnableTwoFactorAuthentication()
    {
        var user = await _userManager.GetUserAsync(User);
        if (user == null)
        {
            return NotFound();
        }

        await _userManager.SetTwoFactorEnabledAsync(user, true);
        await _signInManager.SignOutAsync();

        return RedirectToAction("Login");
    }
}
</iactionresult></applicationuser></applicationuser></applicationuser></applicationuser>

4.4 세션 관리

적절한 세션 관리는 보안을 유지하는 데 중요합니다. 세션 타임아웃을 설정하고, 필요한 경우 강제로 세션을 종료할 수 있어야 합니다.


public void ConfigureServices(IServiceCollection services)
{
    services.AddSession(options =>
    {
        options.IdleTimeout = TimeSpan.FromMinutes(30);
        options.Cookie.HttpOnly = true;
        options.Cookie.IsEssential = true;
    });
}

public void Configure(IApplicationBuilder app)
{
    app.UseSession();
    // 기타 미들웨어 설정...
}

4.5 보안 헤더 설정

적절한 HTTP 보안 헤더를 설정하여 클라이언트 측 보안을 강화할 수 있습니다.


public void Configure(IApplicationBuilder app)
{
    app.Use(async (context, next) =>
    {
        context.Response.Headers.Add("X-Xss-Protection", "1; mode=block");
        context.Response.Headers.Add("X-Frame-Options", "DENY");
        context.Response.Headers.Add("X-Content-Type-Options", "nosniff");
        await next();
    });

    // 기타 미들웨어 설정...
}

이러한 모범 사례들을 적용하면 애플리케이션의 보안을 한층 더 강화할 수 있습니다. 🛡️

5. 테스팅 및 유지보수 🧪

인증 및 권한 관리 시스템을 구현한 후에는 철저한 테스팅과 지속적인 유지보수가 필요합니다.

5.1 단위 테스트

각 컴포넌트의 기능을 개별적으로 테스트하는 단위 테스트는 매우 중요합니다. C#에서는 xUnit이나 NUnit과 같은 프레임워크를 사용할 수 있습니다.


public class AuthenticationTests
{
    private readonly UserManager<applicationuser> _userManager;
    private readonly SignInManager<applicationuser> _signInManager;

    public AuthenticationTests()
    {
        // 테스트를 위한 UserManager와 SignInManager 설정
    }

    [Fact]
    public async Task CanAuthenticateValidUser()
    {
        // Arrange
        var user = new ApplicationUser { UserName = "testuser@example.com", Email = "testuser@example.com" };
        await _userManager.CreateAsync(user, "P@ssw0rd!");

        // Act
        var result = await _signInManager.PasswordSignInAsync(user.UserName, "P@ssw0rd!", false, false);

        // Assert
        Assert.True(result.Succeeded);
    }

    [Fact]
    public async Task CannotAuthenticateInvalidUser()
    {
        // Arrange
        var user = new ApplicationUser { UserName = "testuser@example.com", Email = "testuser@example.com" };
        await _userManager.CreateAsync(user, "P@ssw0rd!");

        // Act
        var result = await _signInManager.PasswordSignInAsync(user.UserName, "WrongPassword", false, false);

        // Assert
        Assert.False(result.Succeeded);
    }
}
</applicationuser></applicationuser>

5.2 통합 테스트

통합 테스트는 여러 컴포넌트가 함께 작동하는 방식을 테스트합니다. 이는 실제 환경과 유사한 조건에서 시스템의 동작을 확인하는 데 중요합니다.


public class AuthorizationIntegrationTests : IClassFixture<webapplicationfactory>>
{
    private readonly WebApplicationFactory<startup> _factory;

    public AuthorizationIntegrationTests(WebApplicationFactory<startup> factory)
    {
        _factory = factory;
    }

    [Fact]
    public async Task CanAccessAuthorizedEndpoint()
    {
        // Arrange
        var client = _factory.CreateClient();
        // 사용자 로그인 로직

        // Act
        var response = await client.GetAsync("/api/secureendpoint");

        // Assert
        response.EnsureSuccessStatusCode();
    }

    [Fact]
    public async Task CannotAccessUnauthorizedEndpoint()
    {
        // Arrange
        var client = _factory.CreateClient();
        // 권한이 없는 사용자 로그인 로직

        // Act
        var response = await client.GetAsync("/api/adminonlyendpoint");

        // Assert
        Assert.Equal(HttpStatusCode.Forbidden, response.StatusCode);
    }
}
</startup></startup></webapplicationfactory>

5.3 보안 감사

정기적인 보안 감사를 통해 시스템의 취약점을 식별하고 해결해야 합니다. 이는 외부 전문가의 도움을 받아 수행하는 것이 좋습니다.

⚠️ 주의: 보안 감사 시 실제 사용자 데이터를 사용하지 않도록 주의해야 합니다. 테스트 환경에서 가상의 데이터로 감사를 진행하세요.

5.4 지속적인 모니터링

로그 분석, 실시간 알림 시스템 등을 통해 시스템을 지속적으로 모니터링해야 합니다. 이를 통해 잠재적인 보안 위협을 조기에 발견하고 대응할 수 있습니다.


public class SecurityMonitoringService
{
    private readonly ILogger<securitymonitoringservice> _logger;

    public SecurityMonitoringService(ILogger<securitymonitoringservice> logger)
    {
        _logger = logger;
    }

    public void MonitorLoginAttempts(string username, bool success)
    {
        if (!success)
        {
            _logger.LogWarning($"Failed login attempt for user: {username}");
            // 추가적인 알림 로직 (예: 이메일 발송, 관리자 알림 등)
        }
    }

    public void MonitorUnauthorizedAccess(string endpoint, string username)
    {
        _logger.LogWarning($"Unauthorized access attempt to {endpoint} by user: {username}");
        // 추가적인 보안 조치 로직
    }
}
</securitymonitoringservice></securitymonitoringservice>

5.5 정기적인 업데이트

사용 중인 라이브러리와 프레임워크를 최신 버전으로 유지하는 것이 중요합니다. 보안 패치와 새로운 기능을 적용하여 시스템의 안전성을 높일 수 있습니다.


// 프로젝트의 .csproj 파일
<itemgroup>
    <packagereference include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" version="5.0.*"></packagereference>
    <packagereference include="Microsoft.EntityFrameworkCore.SqlServer" version="5.0.*"></packagereference>
</itemgroup>

위의 코드에서 버전을 "*"로 설정하면 항상 최신 패치 버전을 사용하게 됩니다. 단, 메이저 버전 업데이트 시에는 호환성을 꼭 확인해야 합니다.

이러한 테스팅 및 유지보수 과정을 통해 인증 및 권한 관리 시스템의 안정성과 보안성을 지속적으로 개선할 수 있습니다. 🔧

결론 🎉

기업용 C# 애플리케이션에서 사용자 인증 및 권한 관리를 구현하는 것은 복잡하지만 매우 중요한 작업입니다. 우리는 이 글을 통해 다음과 같은 주요 내용을 다루었습니다:

  • 사용자 인증의 기본 개념과 C#에서의 구현 방법
  • 권한 관리 시스템 설계와 RBAC 구현
  • 비밀번호 해싱, SSL/TLS 암호화 등의 보안 강화 기법
  • 최소 권한 원칙, 다단계 인 증, 세션 관리 등의 모범 사례
  • 단위 테스트, 통합 테스트, 보안 감사를 포함한 테스팅 및 유지보수 전략

이러한 요소들을 적절히 구현하고 관리함으로써, 안전하고 효율적인 인증 및 권한 관리 시스템을 구축할 수 있습니다. 하지만 보안은 끊임없이 진화하는 분야이므로, 지속적인 학습과 개선이 필요합니다.

💡 핵심 포인트: 보안은 단순히 기술적인 문제가 아닙니다. 조직의 문화, 사용자 교육, 정책 수립 등 다양한 측면을 고려해야 합니다. 기술적 솔루션과 함께 종합적인 보안 전략을 수립하세요.

마지막으로, 보안은 개발 과정의 마지막 단계가 아닌 처음부터 고려해야 할 핵심 요소임을 명심해야 합니다. "보안 중심 설계(Security by Design)" 원칙을 따라 개발 초기 단계부터 보안을 염두에 두고 시스템을 설계하세요.

이 글이 여러분의 C# 애플리케이션 보안 구현에 도움이 되었기를 바랍니다. 안전하고 효율적인 시스템 구축을 위해 노력하는 여러분을 응원합니다! 🚀

추가 자료 및 참고 링크 📚

더 깊이 있는 학습을 원하시는 분들을 위해 몇 가지 유용한 자료를 소개합니다:

이러한 자료들을 통해 C# 애플리케이션의 보안에 대해 더 깊이 있게 학습할 수 있습니다. 지속적인 학습과 실습을 통해 여러분의 보안 스킬을 향상시키세요!

관련 키워드

  • C#
  • 사용자 인증
  • 권한 관리
  • ASP.NET Core Identity
  • RBAC
  • 보안
  • 해싱
  • SSL/TLS
  • CSRF
  • 다단계 인증
  • 세션 관리

지적 재산권 보호

지적 재산권 보호 고지

  1. 저작권 및 소유권: 본 컨텐츠는 재능넷의 독점 AI 기술로 생성되었으며, 대한민국 저작권법 및 국제 저작권 협약에 의해 보호됩니다.
  2. AI 생성 컨텐츠의 법적 지위: 본 AI 생성 컨텐츠는 재능넷의 지적 창작물로 인정되며, 관련 법규에 따라 저작권 보호를 받습니다.
  3. 사용 제한: 재능넷의 명시적 서면 동의 없이 본 컨텐츠를 복제, 수정, 배포, 또는 상업적으로 활용하는 행위는 엄격히 금지됩니다.
  4. 데이터 수집 금지: 본 컨텐츠에 대한 무단 스크래핑, 크롤링, 및 자동화된 데이터 수집은 법적 제재의 대상이 됩니다.
  5. AI 학습 제한: 재능넷의 AI 생성 컨텐츠를 타 AI 모델 학습에 무단 사용하는 행위는 금지되며, 이는 지적 재산권 침해로 간주됩니다.

재능넷은 최신 AI 기술과 법률에 기반하여 자사의 지적 재산권을 적극적으로 보호하며,
무단 사용 및 침해 행위에 대해 법적 대응을 할 권리를 보유합니다.

© 2024 재능넷 | All rights reserved.

댓글 작성
0/2000

댓글 0개

해당 지식과 관련있는 인기재능

안녕하세요.2011년 개업하였고, 2013년 벤처 인증 받은 어플 개발 전문 업체입니다.50만 다운로드가 넘는 앱 2개를 직접 개발/운영 중이며,누구보...

# 최초 의뢰시 개발하고 싶으신 앱의 기능 및 화면구성(UI)에 대한 설명을 같이 보내주세요.# 앱스토어 URL 보내고 단순 카피 해달라고 쪽지 보내...

미국석사준비중인 학생입니다.안드로이드 난독화와 LTE관련 논문 작성하면서 기술적인것들 위주로 구현해보았고,보안기업 개발팀 인턴도 오랜시간 ...

애플리케이션 서비스 안녕하세요. 안드로이드 개발자입니다.여러분들의 홈페이지,블로그,카페,모바일 등 손쉽게 어플로 제작 해드립니다.요즘...

📚 생성된 총 지식 9,982 개

  • (주)재능넷 | 대표 : 강정수 | 경기도 수원시 영통구 봉영로 1612, 7층 710-09 호 (영통동) | 사업자등록번호 : 131-86-65451
    통신판매업신고 : 2018-수원영통-0307 | 직업정보제공사업 신고번호 : 중부청 2013-4호 | jaenung@jaenung.net

    (주)재능넷의 사전 서면 동의 없이 재능넷사이트의 일체의 정보, 콘텐츠 및 UI등을 상업적 목적으로 전재, 전송, 스크래핑 등 무단 사용할 수 없습니다.
    (주)재능넷은 통신판매중개자로서 재능넷의 거래당사자가 아니며, 판매자가 등록한 상품정보 및 거래에 대해 재능넷은 일체 책임을 지지 않습니다.

    Copyright © 2024 재능넷 Inc. All rights reserved.
ICT Innovation 대상
미래창조과학부장관 표창
서울특별시
공유기업 지정
한국데이터베이스진흥원
콘텐츠 제공서비스 품질인증
대한민국 중소 중견기업
혁신대상 중소기업청장상
인터넷에코어워드
일자리창출 분야 대상
웹어워드코리아
인터넷 서비스분야 우수상
정보통신산업진흥원장
정부유공 표창장
미래창조과학부
ICT지원사업 선정
기술혁신
벤처기업 확인
기술개발
기업부설 연구소 인정
마이크로소프트
BizsPark 스타트업
대한민국 미래경영대상
재능마켓 부문 수상
대한민국 중소기업인 대회
중소기업중앙회장 표창
국회 중소벤처기업위원회
위원장 표창