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

🌲 지식인의 숲 🌲

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

 >>>서비스 설명<<<저렴한 가격, 합리적인 가격, 최적의 공수로윈도우 프로그램을 제작해 드립니다고객이 원하는 프로그램...

AS규정기본적으로 A/S 는 평생 가능합니다. *. 구매자의 요청으로 수정 및 보완이 필요한 경우 일정 금액의 수고비를 상호 협의하에 요청 할수 있...

개인용도의 프로그램이나 소규모 프로그램을 합리적인 가격으로 제작해드립니다.개발 아이디어가 있으시다면 부담 갖지 마시고 문의해주세요. ...

안녕하세요!!!고객님이 상상하시는 작업물 그 이상을 작업해 드리려 노력합니다.저는 작업물을 완성하여 고객님에게 보내드리는 것으로 거래 완료...

웹 애플리케이션 보안: SQL 인젝션 방지하기

2024-09-05 00:15:01

재능넷
조회수 790 댓글수 0

웹 애플리케이션 보안: SQL 인젝션 방지하기 🛡️

 

 

웹 애플리케이션 개발에서 보안은 가장 중요한 요소 중 하나입니다. 특히 Python을 사용하여 웹 애플리케이션을 개발할 때, SQL 인젝션 공격에 대한 방어는 필수적입니다. 이 글에서는 SQL 인젝션의 위험성과 이를 방지하기 위한 다양한 기법들을 상세히 살펴보겠습니다. 🐍💻

 

SQL 인젝션이란? 🤔

SQL 인젝션은 악의적인 사용자가 애플리케이션의 입력란을 통해 예상치 못한 SQL 쿼리를 실행하도록 만드는 공격 기법입니다. 이 공격은 데이터베이스의 중요한 정보를 유출하거나 심각한 경우 전체 시스템을 손상시킬 수 있습니다.

 

SQL 인젝션의 위험성 ⚠️

SQL 인젝션 공격의 위험성은 매우 높습니다. 공격자는 다음과 같은 행위를 할 수 있습니다:

  • 데이터 유출: 민감한 사용자 정보나 기업 비밀 등을 탈취할 수 있습니다.
  • 데이터 조작: 데이터베이스의 내용을 변경하거나 삭제할 수 있습니다.
  • 인증 우회: 로그인 시스템을 무력화하고 관리자 권한을 획득할 수 있습니다.
  • 원격 명령 실행: 일부 데이터베이스 시스템에서는 운영체제 명령을 실행할 수 있습니다.

 

Python에서의 SQL 인젝션 취약점 예시 🐍

Python에서 SQL 인젝션에 취약한 코드의 예를 살펴보겠습니다:


import sqlite3

def get_user(username):
    conn = sqlite3.connect('users.db')
    cursor = conn.cursor()
    query = f"SELECT * FROM users WHERE username = '{username}'"
    cursor.execute(query)
    return cursor.fetchone()

# 사용 예시
user_input = input("사용자 이름을 입력하세요: ")
user = get_user(user_input)
print(user)

이 코드는 사용자 입력을 직접 SQL 쿼리에 삽입하고 있어 매우 위험합니다. 악의적인 사용자가 다음과 같은 입력을 제공한다면 어떻게 될까요?


' OR '1'='1

이 경우, 실제 실행되는 쿼리는 다음과 같이 변형됩니다:


SELECT * FROM users WHERE username = '' OR '1'='1'

이 쿼리는 항상 참이 되어 모든 사용자의 정보를 반환하게 됩니다. 😱

 

SQL 인젝션 방지 기법 🛠️

SQL 인젝션을 방지하기 위해 다양한 기법을 사용할 수 있습니다. 여기서는 Python 환경에서 적용할 수 있는 주요 방법들을 살펴보겠습니다.

 

1. 매개변수화된 쿼리 사용 📊

매개변수화된 쿼리(Parameterized Queries)는 SQL 인젝션을 방지하는 가장 효과적인 방법 중 하나입니다. 이 방식은 SQL 문장과 데이터를 분리하여 처리합니다.


import sqlite3

def get_user_safe(username):
    conn = sqlite3.connect('users.db')
    cursor = conn.cursor()
    query = "SELECT * FROM users WHERE username = ?"
    cursor.execute(query, (username,))
    return cursor.fetchone()

# 사용 예시
user_input = input("사용자 이름을 입력하세요: ")
user = get_user_safe(user_input)
print(user)

이 방식에서는 ? 플레이스홀더를 사용하여 데이터가 들어갈 위치를 지정하고, 실제 데이터는 별도로 전달합니다. 데이터베이스 시스템은 이를 안전하게 처리하여 SQL 인젝션을 방지합니다.

 

2. ORM(Object-Relational Mapping) 사용 🔄

ORM을 사용하면 SQL 쿼리를 직접 작성하지 않고도 데이터베이스 작업을 수행할 수 있습니다. Python에서 가장 인기 있는 ORM 중 하나는 SQLAlchemy입니다.


from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    username = Column(String)
    email = Column(String)

engine = create_engine('sqlite:///users.db')
Session = sessionmaker(bind=engine)

def get_user_orm(username):
    session = Session()
    user = session.query(User).filter(User.username == username).first()
    session.close()
    return user

# 사용 예시
user_input = input("사용자 이름을 입력하세요: ")
user = get_user_orm(user_input)
print(user.username, user.email)

ORM을 사용하면 SQL 인젝션 위험을 크게 줄일 수 있습니다. ORM은 내부적으로 매개변수화된 쿼리를 사용하여 데이터를 안전하게 처리합니다.

 

3. 입력 검증 및 이스케이핑 🔍

사용자 입력을 직접 SQL 쿼리에 사용해야 하는 경우, 입력값을 철저히 검증하고 이스케이핑 처리를 해야 합니다.


import re
import sqlite3

def sanitize_input(input_string):
    # 알파벳과 숫자만 허용
    return re.sub(r'[^a-zA-Z0-9]', '', input_string)

def get_user_sanitized(username):
    conn = sqlite3.connect('users.db')
    cursor = conn.cursor()
    sanitized_username = sanitize_input(username)
    query = f"SELECT * FROM users WHERE username = '{sanitized_username}'"
    cursor.execute(query)
    return cursor.fetchone()

# 사용 예시
user_input = input("사용자 이름을 입력하세요: ")
user = get_user_sanitized(user_input)
print(user)

이 방법은 완벽한 해결책은 아니지만, 매개변수화된 쿼리를 사용할 수 없는 상황에서 차선책으로 사용할 수 있습니다.

 

4. 최소 권한 원칙 적용 🔐

데이터베이스 사용자 계정에 필요한 최소한의 권한만 부여하는 것도 중요한 보안 방법입니다. 예를 들어, 읽기 전용 작업만 필요한 경우 SELECT 권한만 부여하고, 데이터 수정이 필요한 경우에만 UPDATE 권한을 부여합니다.


# 데이터베이스 권한 설정 예시 (PostgreSQL)
CREATE USER read_only_user WITH PASSWORD 'password';
GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only_user;

이렇게 설정하면 공격자가 SQL 인젝션에 성공하더라도 할 수 있는 행동을 제한할 수 있습니다.

 

5. 저장 프로시저 사용 📦

저장 프로시저를 사용하면 SQL 쿼리를 미리 정의하고 매개변수만 전달하여 실행할 수 있습니다. 이 방법은 SQL 인젝션 위험을 줄이는 데 도움이 됩니다.


# 저장 프로시저 생성 예시 (MySQL)
DELIMITER //
CREATE PROCEDURE get_user(IN username VARCHAR(50))
BEGIN
    SELECT * FROM users WHERE username = username;
END //
DELIMITER ;

# Python에서 저장 프로시저 호출
import mysql.connector

def call_stored_procedure(username):
    conn = mysql.connector.connect(user='your_username', password='your_password',
                                   host='localhost', database='your_database')
    cursor = conn.cursor()
    cursor.callproc('get_user', (username,))
    for result in cursor.stored_results():
        return result.fetchone()
    cursor.close()
    conn.close()

# 사용 예시
user_input = input("사용자 이름을 입력하세요: ")
user = call_stored_procedure(user_input)
print(user)

저장 프로시저를 사용하면 데이터베이스 레벨에서 쿼리를 관리할 수 있어 보안성이 향상됩니다.

 

추가적인 보안 고려사항 🔒

SQL 인젝션 방지는 웹 애플리케이션 보안의 중요한 부분이지만, 이것만으로는 충분하지 않습니다. 다음과 같은 추가적인 보안 조치도 고려해야 합니다:

  • HTTPS 사용: 모든 데이터 전송을 암호화하여 중간자 공격을 방지합니다.
  • 입력 유효성 검사: 서버 측에서 모든 사용자 입력을 철저히 검증합니다.
  • 출력 인코딩: XSS(Cross-Site Scripting) 공격을 방지하기 위해 출력 데이터를 적절히 인코딩합니다.
  • 세션 관리: 안전한 세션 관리로 세션 하이재킹을 방지합니다.
  • 에러 처리: 상세한 에러 메시지가 외부로 노출되지 않도록 합니다.

 

결론 🎯

SQL 인젝션은 웹 애플리케이션에 심각한 위협이 될 수 있지만, 적절한 방어 기법을 사용하면 효과적으로 방지할 수 있습니다. Python 개발자로서 매개변수화된 쿼리, ORM, 입력 검증 등의 기술을 적극적으로 활용하여 안전한 웹 애플리케이션을 구축해야 합니다.

보안은 지속적인 과정입니다. 새로운 취약점과 공격 기법이 계속해서 등장하므로, 개발자는 항상 최신 보안 동향을 파악하고 애플리케이션을 지속적으로 업데이트해야 합니다. 이는 재능넷과 같은 플랫폼에서 제공하는 지식 공유와 커뮤니티 참여를 통해 더욱 효과적으로 이루어질 수 있습니다. 💪

안전한 웹 애플리케이션 개발은 사용자의 신뢰를 얻고 비즈니스의 성공을 보장하는 핵심 요소입니다. SQL 인젝션 방지는 그 첫 걸음이며, 이를 통해 더 안전하고 신뢰할 수 있는 디지털 환경을 만들어 나갈 수 있습니다. 🌐🔐

고급 SQL 인젝션 방어 기법 🛡️

기본적인 SQL 인젝션 방어 기법을 넘어, 더욱 강력한 보안을 위한 고급 기법들을 살펴보겠습니다. 이러한 기법들은 복잡한 웹 애플리케이션에서 특히 유용할 수 있습니다.

 

1. 화이트리스트 기반 입력 검증 ✅

화이트리스트 접근 방식은 허용된 입력만을 받아들이는 방법입니다. 이는 블랙리스트 방식(특정 패턴을 차단)보다 더 안전합니다.


import re

def validate_input(input_string, pattern):
    return bool(re.match(pattern, input_string))

# 사용 예시
username_pattern = r'^[a-zA-Z0-9_]{3,20}$'
user_input = input("사용자 이름을 입력하세요: ")

if validate_input(user_input, username_pattern):
    print("유효한 사용자 이름입니다.")
else:
    print("유효하지 않은 사용자 이름입니다.")

이 방식은 허용된 문자와 길이만 받아들이므로 SQL 인젝션 시도를 효과적으로 차단할 수 있습니다.

 

2. SQL 쿼리 로깅 및 모니터링 📊

모든 SQL 쿼리를 로깅하고 모니터링하면 비정상적인 패턴을 감지하고 대응할 수 있습니다.


import logging
from datetime import datetime

logging.basicConfig(filename='sql_queries.log', level=logging.INFO)

def log_query(query, params):
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    logging.info(f"[{timestamp}] Query: {query}, Params: {params}")

def execute_query(query, params):
    log_query(query, params)
    # 실제 쿼리 실행 코드
    # ...

# 사용 예시
query = "SELECT * FROM users WHERE username = ?"
params = ('john_doe',)
execute_query(query, params)

이렇게 로깅된 정보는 보안 감사나 이상 탐지에 활용될 수 있습니다.

 

3. 데이터베이스 암호화 🔐

중요한 데이터는 데이터베이스 레벨에서 암호화하여 저장합니다. 이는 SQL 인젝션 공격이 성공하더라도 데이터의 기밀성을 유지할 수 있게 해줍니다.


from cryptography.fernet import Fernet

# 키 생성
key = Fernet.generate_key()
cipher_suite = Fernet(key)

def encrypt_data(data):
    return cipher_suite.encrypt(data.encode()).decode()

def decrypt_data(encrypted_data):
    return cipher_suite.decrypt(encrypted_data.encode()).decode()

# 사용 예시
sensitive_data = "매우 중요한 정보"
encrypted = encrypt_data(sensitive_data)
print(f"암호화된 데이터: {encrypted}")

decrypted = decrypt_data(encrypted)
print(f"복호화된 데이터: {decrypted}")

이 방식을 사용하면 데이터베이스에 저장된 중요 정보가 암호화되어, 공격자가 데이터에 접근하더라도 그 내용을 해석할 수 없게 됩니다.

 

4. 웹 애플리케이션 방화벽(WAF) 사용 🧱

WAF는 HTTP 요청을 분석하여 SQL 인젝션을 포함한 다양한 웹 공격을 차단할 수 있습니다. Python에서는 WSGI 미들웨어를 사용하여 간단한 WAF 기능을 구현할 수 있습니다.


import re
from werkzeug.wrappers import Request, Response

class SimpleWAF(object):
    def __init__(self, app):
        self.app = app
        self.blacklist = [
            r'UNION.*SELECT',
            r'--',
            r';',
            r'DROP.*TABLE',
            r'INSERT.*INTO',
            r'DELETE.*FROM',
        ]

    def __call__(self, environ, start_response):
        request = Request(environ)
        for key, value in request.args.items():
            if self.is_attack(value):
                res = Response(u'검출된 공격 시도', mimetype= 'text/plain', status=403)
                return res(environ, start_response)
        return self.app(environ, start_response)

    def is_attack(self, value):
        return any(re.search(pattern, value, re.IGNORECASE) for pattern in self.blacklist)

# Flask 애플리케이션에 WAF 적용 예시
from flask import Flask

app = Flask(__name__)
app.wsgi_app = SimpleWAF(app.wsgi_app)

@app.route('/')
def hello():
    return "Hello, World!"

if __name__ == '__main__':
    app.run()

이 간단한 WAF는 기본적인 SQL 인젝션 패턴을 차단할 수 있습니다. 실제 환경에서는 더 복잡하고 정교한 WAF 솔루션을 사용하는 것이 좋습니다.

 

5. 데이터베이스 접근 추상화 레이어 구현 🏗️

데이터베이스 접근을 추상화하는 레이어를 구현하면, SQL 쿼리 생성과 실행을 중앙에서 관리할 수 있어 보안을 강화할 수 있습니다.


import sqlite3

class DatabaseAccessLayer:
    def __init__(self, db_path):
        self.db_path = db_path

    def execute_query(self, query, params=None):
        with sqlite3.connect(self.db_path) as conn:
            cursor = conn.cursor()
            if params:
                cursor.execute(query, params)
            else:
                cursor.execute(query)
            return cursor.fetchall()

    def insert_user(self, username, email):
        query = "INSERT INTO users (username, email) VALUES (?, ?)"
        self.execute_query(query, (username, email))

    def get_user(self, username):
        query = "SELECT * FROM users WHERE username = ?"
        return self.execute_query(query, (username,))

# 사용 예시
db = DatabaseAccessLayer('users.db')
db.insert_user('john_doe', 'john@example.com')
user = db.get_user('john_doe')
print(user)

이 접근 방식은 데이터베이스 작업을 일관되게 처리하고, SQL 인젝션 방지를 위한 매개변수화된 쿼리 사용을 강제할 수 있습니다.

 

보안 테스팅 및 취약점 스캐닝 🔍

SQL 인젝션 방어 기법을 구현한 후에는 반드시 철저한 보안 테스팅을 수행해야 합니다. 자동화된 취약점 스캐너와 수동 테스트를 병행하는 것이 좋습니다.

자동화된 취약점 스캐너 사용 🤖

Python에서 사용할 수 있는 몇 가지 보안 테스팅 도구들이 있습니다:

  • OWASP ZAP (Zed Attack Proxy): 오픈 소스 웹 애플리케이션 보안 스캐너
  • SQLmap: SQL 인젝션 취약점을 자동으로 탐지하고 익스플로잇하는 도구
  • Bandit: Python 코드의 보안 이슈를 정적 분석하는 도구

예를 들어, Bandit을 사용한 코드 분석은 다음과 같이 할 수 있습니다:


# 터미널에서 실행
pip install bandit
bandit -r /path/to/your/python/project

이 명령은 프로젝트 전체를 스캔하여 잠재적인 보안 문제를 보고합니다.

 

수동 보안 테스트 👨‍💻

자동화된 도구와 함께, 수동으로 다양한 SQL 인젝션 공격 시나리오를 테스트하는 것도 중요합니다. 예를 들어:

  • 다양한 특수 문자와 SQL 키워드를 포함한 입력 시도
  • 여러 종류의 SQL 인젝션 페이로드 테스트
  • 블라인드 SQL 인젝션 시나리오 테스트
  • 시간 기반 SQL 인젝션 공격 시도

이러한 수동 테스트는 자동화된 도구가 놓칠 수 있는 복잡한 취약점을 발견하는 데 도움이 됩니다.

 

지속적인 보안 관리 🔄

SQL 인젝션 방어는 일회성 작업이 아닌 지속적인 과정입니다. 다음과 같은 방법으로 지속적인 보안 관리를 수행할 수 있습니다:

1. 정기적인 보안 감사 📋

정기적으로 코드 리뷰와 보안 감사를 실시하여 새로운 취약점이나 보안 위험을 식별하고 해결합니다.

2. 보안 패치 및 업데이트 🔧

사용 중인 모든 라이브러리, 프레임워크, 데이터베이스 시스템을 최신 버전으로 유지하고, 보안 패치를 신속히 적용합니다.

3. 보안 교육 및 인식 제고 🎓

개발 팀 전체가 SQL 인젝션을 포함한 웹 보안 위협에 대해 잘 이해하고 있어야 합니다. 정기적인 보안 교육을 실시하는 것이 좋습니다.

4. 인시던트 대응 계획 수립 🚨

SQL 인젝션 공격이 발생했을 때를 대비한 인시던트 대응 계획을 수립하고 정기적으로 훈련합니다.

 

결론 🏁

SQL 인젝션은 여전히 웹 애플리케이션에 대한 심각한 위협입니다. 그러나 이 글에서 다룬 다양한 방어 기법들을 적절히 구현하면, SQL 인젝션 공격으로부터 애플리케이션을 효과적으로 보호할 수 있습니다.

핵심은 다층적인 방어 전략을 채택하는 것입니다. 매개변수화된 쿼리, ORM 사용, 입력 검증, 최소 권한 원칙 적용, 암호화, WAF 사용 등 다양한 기법을 조합하여 사용하세요. 또한, 지속적인 모니터링과 보안 테스팅을 통해 새로운 취약점을 신속히 발견하고 대응할 수 있어야 합니다.

보안은 개발 과정의 모든 단계에서 고려되어야 하는 중요한 요소입니다. SQL 인젝션 방어는 그 시작점일 뿐입니다. 전체적인 보안 전략의 일부로서 SQL 인젝션 방어를 구현하고, 지속적으로 개선해 나가는 것이 중요합니다.

마지막으로, 보안은 팀 전체의 책임이라는 점을 명심하세요. 개발자, 테스터, 운영 팀, 그리고 경영진 모두가 보안의 중요성을 인식하고 각자의 역할을 다해야 합니다. 함께 노력한다면, 더 안전하고 신뢰할 수 있는 웹 애플리케이션을 만들 수 있을 것입니다. 🌟

SQL 인젝션 방어는 끊임없는 학습과 개선이 필요한 분야입니다. 새로운 공격 기법과 방어 전략이 계속해서 등장하고 있으므로, 최신 동향을 주시하고 지식을 업데이트하는 것이 중요합니다. 재능넷과 같은 플랫폼을 통해 다른 개발자들과 경험을 공유하고, 새로운 기술을 배우는 것도 좋은 방법입니다. 함께 성장하며 더 안전한 디지털 세상을 만들어 나가는 여정에 동참해 주세요! 💪🌐

관련 키워드

  • SQL 인젝션
  • 웹 보안
  • Python
  • 데이터베이스 보안
  • 매개변수화된 쿼리
  • ORM
  • 입력 검증
  • 암호화
  • WAF
  • 보안 테스팅

지식의 가치와 지적 재산권 보호

자유 결제 서비스

'지식인의 숲'은 "이용자 자유 결제 서비스"를 통해 지식의 가치를 공유합니다. 콘텐츠를 경험하신 후, 아래 안내에 따라 자유롭게 결제해 주세요.

자유 결제 : 국민은행 420401-04-167940 (주)재능넷
결제금액: 귀하가 받은 가치만큼 자유롭게 결정해 주세요
결제기간: 기한 없이 언제든 편한 시기에 결제 가능합니다

지적 재산권 보호 고지

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

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

© 2024 재능넷 | All rights reserved.

댓글 작성
0/2000

댓글 0개

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

30년간 직장 생활을 하고 정년 퇴직을 하였습니다.퇴직 후 재능넷 수행 내용은 쇼핑몰/학원/판매점 등 관리 프로그램 및 데이터 ...

​주문전 쪽지로 업무협의 부탁드려요!!​응용 S/W 프로그램개발 15년차 입니다.​​GIS(지리정보시스템), 영상처리, 2D/3D그래픽, 데이터베...

📚 생성된 총 지식 9,521 개

  • (주)재능넷 | 대표 : 강정수 | 경기도 수원시 영통구 봉영로 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 스타트업
대한민국 미래경영대상
재능마켓 부문 수상
대한민국 중소기업인 대회
중소기업중앙회장 표창
국회 중소벤처기업위원회
위원장 표창