OWASP

  • 62 minutes to read

목차

  1. 강의 소개

    • OWASP 소개 및 미션
    • OWASP Top 10의 목적과 중요성
    • 웹 애플리케이션 보안의 중요성
  2. OWASP Top 10 개요

    • OWASP Top 10의 역사
    • 최신 OWASP Top 10 (버전 소개)
    • 보안 위협의 변화와 트렌드
  3. OWASP Top 10 취약점 상세 설명

    1. A01: 2021 – Broken Access Control

      • 설명: 접근 제어 실패
      • 예시: 권한 초과, 인가되지 않은 리소스 접근
      • 방어 방법: 최소 권한 원칙, 철저한 인증 및 인가
      • ASP.NET Core Identity 적용 사례
    2. A02: 2021 – Cryptographic Failures

      • 설명: 암호화 관련 실패
      • 예시: 약한 암호화 알고리즘 사용, 민감한 데이터 노출
      • 방어 방법: 최신 암호화 표준 사용, 강력한 암호화 키 관리
      • ASP.NET Core Identity 적용 사례
    3. A03: 2021 – Injection

      • 설명: SQL, NoSQL, OS 및 LDAP 인젝션
      • 예시: 악의적인 쿼리 삽입을 통한 데이터베이스 접근
      • 방어 방법: 입력 검증 및 쿼리 파라미터화
      • ASP.NET Core Identity 적용 사례
    4. A04: 2021 – Insecure Design

      • 설명: 취약한 시스템 설계
      • 예시: 보안 요구사항 미충족, 취약한 아키텍처
      • 방어 방법: 보안 중심의 시스템 설계 및 아키텍처 분석
      • ASP.NET Core Identity 적용 사례
    5. A05: 2021 – Security Misconfiguration

      • 설명: 보안 설정 오류
      • 예시: 기본 설정 사용, 불필요한 기능 활성화
      • 방어 방법: 최소 설정 원칙, 정기적인 설정 검토 및 업데이트
      • ASP.NET Core Identity 적용 사례
    6. A06: 2021 – Vulnerable and Outdated Components

      • 설명: 취약하거나 오래된 구성 요소
      • 예시: 패치되지 않은 라이브러리나 프레임워크 사용
      • 방어 방법: 최신 버전 사용, 취약점 관리 프로세스 적용
      • ASP.NET Core Identity 적용 사례
    7. A07: 2021 – Identification and Authentication Failures

      • 설명: 인증 및 세션 관리 실패
      • 예시: 취약한 인증 방식, 세션 하이재킹
      • 방어 방법: 강력한 인증 정책, 세션 보안
      • ASP.NET Core Identity 적용 사례
    8. A08: 2021 – Software and Data Integrity Failures

      • 설명: 소프트웨어 및 데이터 무결성 실패
      • 예시: 무결성 검증 없이 외부 소프트웨어 사용
      • 방어 방법: 디지털 서명, 무결성 검증 메커니즘
      • ASP.NET Core Identity 적용 사례
    9. A09: 2021 – Security Logging and Monitoring Failures

      • 설명: 보안 로깅 및 모니터링 실패
      • 예시: 로그 부족, 비정상 행동 미감지
      • 방어 방법: 포괄적인 로깅 및 실시간 모니터링
      • ASP.NET Core Identity 적용 사례
    10. A10: 2021 – Server-Side Request Forgery (SSRF)

      • 설명: 서버사이드 요청 위조
      • 예시: 신뢰할 수 없는 사용자 입력을 통한 서버사이드 요청
      • 방어 방법: 입력 검증, 아웃바운드 요청 제한
      • ASP.NET Core Identity 적용 사례
  4. OWASP Top 10 취약점 대응 전략

    • 보안 모범 사례 (Best Practices)
    • CI/CD 파이프라인 내 보안 적용 방안
    • 보안 도구 및 자동화 사용법
  5. 실습 세션 (선택 사항)

    • 각 취약점에 대한 실습
    • 취약점 진단 도구 사용법 (예: Burp Suite, OWASP ZAP)
    • 취약점 해결을 위한 코드 리뷰 실습
  6. Q&A 및 토론

    • 질의응답
    • 실무 적용 사례 토론
  7. 강의 요약 및 마무리

    • 주요 내용 요약
    • 향후 웹 애플리케이션 보안 트렌드
    • OWASP 자원 및 커뮤니티 소개

OWASP

1. 강의 소개

OWASP 소개 및 미션

OWASP( Open Web Application Security Project )는 전 세계적으로 웹 애플리케이션 보안 향상을 목표로 하는 비영리 단체입니다. 2001년에 설립된 OWASP는 개발자, 보안 전문가, 연구자 등이 웹 애플리케이션에서 발생할 수 있는 다양한 보안 취약점을 예방하고 개선하는 방법을 연구하고 공유하는 글로벌 커뮤니티를 형성하고 있습니다.

OWASP의 주요 미션은 다음과 같습니다:

  • 웹 보안 표준 제정 및 권고: 안전한 웹 애플리케이션 개발을 위한 지침 제공.
  • 취약점 연구 및 교육: 최신 보안 취약점 연구와 함께 교육 자료, 도구 등을 무료로 제공하여 웹 애플리케이션 보안에 대한 인식을 높임.
  • 커뮤니티 중심 활동: 전 세계 보안 전문가들과 협력하여 다양한 프로젝트를 진행하고, 웹 보안 분야에서 발생하는 문제들을 해결하는 데 기여.

OWASP Top 10의 목적과 중요성

OWASP Top 10은 웹 애플리케이션에서 발생할 수 있는 가장 중요한 보안 취약점 10가지를 선정하여 제공하는 보고서입니다. 이를 통해 웹 개발자 및 보안 전문가들이 보안 위협을 인식하고, 이러한 위협을 예방하거나 대응하는 방법을 숙지할 수 있습니다.

OWASP Top 10의 목적:

  • 보안 인식 제고: 개발자 및 관리자에게 보안 취약점의 중요성을 알리고, 보안 모범 사례를 따르도록 장려.
  • 위협에 대한 가시성: 최신 위협과 공격 기법을 분석하여, 실무자들이 빠르게 대응할 수 있도록 함.
  • 보안 정책 가이드라인: 보안 정책 수립에 있어 필수적인 지침을 제공하고, 기업의 보안 성숙도를 높이는 데 도움을 줌.

OWASP Top 10은 전 세계적으로 보안 분야의 표준으로 널리 인정받고 있으며, 웹 애플리케이션 보안을 강화하기 위한 필수 지침으로 사용됩니다.

웹 애플리케이션 보안의 중요성

웹 애플리케이션은 기업의 중요한 데이터를 처리하고 고객과의 상호작용을 지원하는 핵심 요소로 자리잡고 있습니다. 하지만, 웹 애플리케이션이 공격자에게 쉽게 노출될 수 있는 취약점을 내포하고 있을 경우, 데이터 유출, 서비스 중단, 평판 손상 등 심각한 피해를 초래할 수 있습니다.

웹 애플리케이션 보안의 중요성은 다음과 같습니다:

  • 데이터 보호: 개인 정보, 금융 정보 등 민감한 데이터를 보호하지 못하면 법적 제재 및 경제적 손실을 초래할 수 있습니다.
  • 신뢰도 유지: 사용자의 데이터를 안전하게 보호하는 것은 기업의 신뢰도를 유지하는 핵심 요소입니다.
  • 법적 요구 사항 준수: GDPR과 같은 개인정보 보호법을 준수하지 않을 경우 벌금 및 소송에 직면할 수 있습니다.
  • 비즈니스 연속성 보장: 보안 취약점으로 인해 서비스가 중단되면, 기업의 비즈니스가 위협받을 수 있습니다.

2. OWASP Top 10 개요

OWASP Top 10의 역사

OWASP Top 10은 2003년에 처음 발간된 이후로 주기적으로 업데이트되며, 그동안 웹 애플리케이션 보안의 방향성을 제시해 온 중요한 보고서입니다. OWASP 커뮤니티의 연구자와 전문가들이 최신 위협과 공격 기법을 분석하여 취약점을 선정하며, 약 4년마다 새로운 버전이 발간됩니다.

OWASP Top 10의 주요 업데이트 이력은 다음과 같습니다:

  • 2003년: OWASP Top 10 최초 발행
  • 2007년, 2010년, 2013년: 새로운 취약점 추가 및 중요도 재조정
  • 2017년, 2021년: 최신 공격 기법 반영 및 새로운 취약점 포함

OWASP Top 10은 진화하는 공격 기법과 보안 위협에 맞추어 지속적으로 개정되며, 이를 통해 실무자들이 최신 보안 동향에 대응할 수 있도록 지원합니다.

최신 OWASP Top 10 (버전 소개)

가장 최근 버전은 2021년 OWASP Top 10이며, 2021년에 발표되었습니다. 이 버전에서는 기존 취약점의 중요도 변화와 함께, 새로운 취약점이 추가되었습니다. 다음은 2021년 OWASP Top 10의 주요 항목입니다:

  1. Broken Access Control (접근 제어 실패)
  2. Cryptographic Failures (암호화 실패)
  3. Injection (인젝션)
  4. Insecure Design (취약한 설계)
  5. Security Misconfiguration (보안 설정 오류)
  6. Vulnerable and Outdated Components (취약하거나 오래된 구성 요소)
  7. Identification and Authentication Failures (인증 및 세션 관리 실패)
  8. Software and Data Integrity Failures (소프트웨어 및 데이터 무결성 실패)
  9. Security Logging and Monitoring Failures (보안 로깅 및 모니터링 실패)
  10. Server-Side Request Forgery (서버사이드 요청 위조, SSRF)

보안 위협의 변화와 트렌드

웹 애플리케이션의 보안 위협은 끊임없이 진화하고 변화하고 있습니다. 최신 트렌드는 공격이 더욱 자동화되고 복잡해지며, **인공지능(AI)과 머신러닝(ML)**을 이용한 공격 기법이 점차 확산되고 있습니다. 또한, 클라우드 컴퓨팅과 마이크로서비스 아키텍처의 사용이 증가함에 따라, **서버사이드 요청 위조(SSRF)**와 같은 취약점이 주목받고 있습니다.

보안 위협의 주요 변화는 다음과 같습니다:

  • 클라우드 보안 위협 증가: 클라우드 기반 서비스가 증가함에 따라, 공유 자원, 인증 토큰 탈취 등의 위협이 증가하고 있습니다.
  • 공급망 공격: 서드파티 소프트웨어나 외부 구성 요소를 악용하여 시스템에 침투하는 공격이 크게 증가했습니다.
  • Ransomware(랜섬웨어) 확산: 데이터나 시스템을 암호화한 후 금전을 요구하는 랜섬웨어 공격이 증가하고 있으며, 이를 통해 막대한 피해가 발생하고 있습니다.
  • 보안 자동화 도구의 발전: 공격자들은 취약점 탐지와 공격을 자동화하는 도구를 통해 대규모 공격을 감행하고 있습니다.

이러한 변화하는 보안 트렌드에 대응하기 위해 OWASP Top 10은 계속해서 발전하며, 최신 취약점에 맞춘 보안 전략과 실무 가이드를 제공합니다.

Broken Access Control

A01: 2021 – Broken Access Control (접근 제어 실패)

설명

Broken Access Control은 인가되지 않은 사용자가 허가받지 않은 데이터에 접근하거나 권한을 초과하는 작업을 수행하는 보안 취약점을 말합니다. 접근 제어 실패는 애플리케이션에서 적절한 권한 검증이 이루어지지 않기 때문에 발생하며, 이를 악용하면 민감한 정보에 접근하거나, 다른 사용자의 데이터를 수정 및 삭제할 수 있습니다.

주요 예시

  • 권한 초과 (Privilege Escalation): 일반 사용자가 관리자 권한을 얻어 시스템을 제어하는 경우
  • 수직적 접근 제어 실패 (Vertical Access Control Failure): 사용자가 자신의 권한을 초과하여 더 높은 권한의 데이터를 접근
  • 수평적 접근 제어 실패 (Horizontal Access Control Failure): 사용자가 다른 사용자 계정의 정보를 볼 수 있는 경우 (예: ID를 변경해 다른 사용자 정보 접근)
  • 비인가된 리소스 접근: 적절한 인증 및 인가 절차 없이 민감한 리소스에 접근할 수 있는 경우

방어 방법

  1. 최소 권한 원칙 (Principle of Least Privilege): 사용자에게 필요한 최소한의 권한만 부여하여 불필요한 권한 남용을 방지합니다.
  2. 인증 및 인가 철저 관리: 애플리케이션에서 모든 요청에 대해 적절한 인증 및 인가 검사를 수행해야 하며, 특히 중요한 자원이나 기능에 대한 접근은 권한 검사를 강화해야 합니다.
  3. 정기적 보안 테스트: 접근 제어의 취약점을 발견하기 위한 보안 테스트를 정기적으로 수행해야 합니다. 특히 권한 초과나 권한 남용을 방지하기 위해 외부 보안 검토 및 테스트를 진행하는 것이 효과적입니다.
  4. 자원 보호: URL, API, 데이터베이스 등 리소스에 대한 직접 접근을 제한하고, 모든 요청에 대해 적절한 접근 제어 검사를 수행합니다.
  5. 강력한 세션 관리: 인증된 세션을 기반으로 적절한 권한을 할당하고, 세션이 끝날 때마다 권한을 초기화하여 보안을 강화합니다.

ASP.NET Core Identity 적용 사례:

ASP.NET Core Identity에서 역할 기반 권한 관리를 통해 사용자에게 최소 권한 원칙을 적용할 수 있습니다. 예를 들어, 관리자는 Admin 역할을 부여받아 관리자 전용 페이지에 접근할 수 있지만, 일반 사용자에게는 User 역할을 부여하여 관리자 기능에 접근할 수 없도록 설정할 수 있습니다. Authorize 특성을 사용해 컨트롤러 또는 액션 메서드에서 역할 기반 접근 제어를 적용할 수 있습니다.

[Authorize(Roles = "Admin")]
public IActionResult AdminPanel()
{
    return View();
}

Cryptographic Failures

A02: 2021 – Cryptographic Failures (암호화 관련 실패)

설명

Cryptographic Failures는 암호화가 부적절하게 구현되거나 사용되는 경우 발생하는 보안 취약점입니다. 이는 민감한 데이터가 안전하게 보호되지 않거나, 공격자에게 쉽게 노출될 수 있는 위험을 초래합니다. 암호화와 관련된 실패는 암호화되지 않은 데이터 저장, 전송 중 민감한 정보의 노출, 또는 약한 암호화 알고리즘 사용으로 인해 발생할 수 있습니다.

주요 예시

  • 약한 암호화 알고리즘 사용: SHA-1이나 MD5와 같은 오래되거나 취약한 알고리즘 사용으로 인해 데이터 무결성이나 기밀성이 보장되지 않음.

  • 민감한 데이터 암호화 없이 저장: 사용자 비밀번호나 신용카드 정보 등 민감한 데이터를 평문으로 저장하여 외부에 노출될 가능성이 높아짐.

  • 암호화 키 관리 실패: 키를 안전하게 저장하지 않거나, 키가 유출되는 경우 암호화된 데이터가 쉽게 해독될 수 있음.

  • 데이터 전송 중 보호되지 않은 연결 사용: HTTPS 대신 HTTP를 사용하여 민감한 데이터 전송 시, 중간자 공격(Man-in-the-Middle Attack)에 노출됨.

방어 방법

  1. 최신 암호화 표준 사용: 강력한 암호화 알고리즘(예: AES-256, RSA)을 사용하고, 취약한 알고리즘(SHA-1, MD5 등)은 사용하지 않도록 합니다.
  2. 민감한 데이터 암호화: 모든 민감한 데이터를 저장하거나 전송할 때 강력한 암호화 알고리즘을 사용하여 암호화합니다.
  3. 암호화 키 관리 강화: 암호화 키는 안전한 장소에 저장하고, 주기적으로 키를 변경하며, 적절한 키 관리 정책을 수립하여 키가 유출되지 않도록 합니다.
  4. 전송 중 데이터 보호: 민감한 데이터가 전송될 때는 HTTPS와 같은 보안 프로토콜을 사용하여 데이터가 안전하게 전송되도록 합니다.
  5. 강력한 비밀번호 저장: 비밀번호는 해시된 상태로 저장해야 하며, Bcrypt, Argon2와 같은 해시 함수와 솔트(Salt)를 사용하여 보안을 강화합니다.

ASP.NET Core Identity 적용 사례:

ASP.NET Core Identity는 기본적으로 PBKDF2 해시 함수를 사용하여 비밀번호를 해싱합니다. 솔트와 함께 다단계 해싱을 적용하여 비밀번호가 안전하게 저장되며, 약한 암호화 알고리즘을 사용하는 것을 방지합니다. 비밀번호 해싱 방식은 PasswordHasherOptions에서 설정 가능하며, 최신 해싱 알고리즘을 사용해 비밀번호를 보호할 수 있습니다.

services.AddIdentity<ApplicationUser, IdentityRole>(options =>
{
    options.Password.RequireDigit = true;
    options.Password.RequireLowercase = true;
    options.Password.RequiredLength = 8;
    options.Password.RequireNonAlphanumeric = false;
}).AddEntityFrameworkStores<ApplicationDbContext>();

Injection

A03: 2021 – Injection (인젝션)

설명

Injection 취약점은 애플리케이션이 외부에서 전달된 데이터를 제대로 검증하지 않고 코드나 명령어로 실행할 때 발생합니다. 이로 인해 공격자가 악성 명령어를 주입하여 데이터베이스나 시스템 명령을 임의로 실행할 수 있게 됩니다. 주로 발생하는 인젝션 취약점에는 SQL 인젝션, NoSQL 인젝션, OS 명령어 인젝션, LDAP 인젝션 등이 있으며, 이러한 공격은 애플리케이션의 데이터를 노출하거나 수정, 삭제하는 등의 심각한 결과를 초래할 수 있습니다.

주요 예시

  • SQL Injection: 공격자가 입력 필드에 악의적인 SQL 쿼리를 삽입하여 데이터베이스에 직접 접근, 데이터를 탈취하거나 삭제함. 예를 들어, 로그인 페이지의 입력 필드에 ' OR '1'='1' 같은 쿼리를 삽입하여 비인가된 로그인을 시도.
  • NoSQL Injection: NoSQL 데이터베이스에서 사용자 입력을 검증하지 않아 발생하는 취약점으로, 악성 데이터를 삽입하여 데이터베이스의 구조를 변경하거나 무단 접근을 가능하게 함.
  • OS Command Injection: 공격자가 시스템 명령어를 웹 애플리케이션에 삽입하여 서버에서 직접 실행되도록 하는 공격. 이를 통해 공격자는 서버의 파일 시스템에 접근하거나 명령어를 실행할 수 있음.
  • LDAP Injection: 공격자가 LDAP 쿼리에 악성 데이터를 삽입하여 디렉터리 서비스의 정보를 탈취하거나 조작하는 공격.

방어 방법

  1. 입력 검증 (Input Validation): 모든 사용자 입력을 철저히 검증하고, 예상치 못한 입력이 실행되지 않도록 합니다. 입력 데이터를 허용 리스트(Whitelist)로 제한하여 인젝션 공격을 방지합니다.
  2. 쿼리 파라미터화 (Parameterized Queries): SQL 쿼리나 명령어를 작성할 때 사용자가 제공하는 입력을 변수로 처리하여 인젝션 공격이 발생하지 않도록 해야 합니다. 이를 통해 사용자의 입력이 직접적으로 쿼리에 삽입되지 않도록 합니다.
  3. ORM 사용 (Object-Relational Mapping): 데이터베이스 접근에 ORM을 사용하면 SQL 쿼리를 자동으로 생성하므로 인젝션 공격 위험을 줄일 수 있습니다.
  4. 준비된 쿼리 (Prepared Statements): SQL 및 NoSQL 인젝션을 방지하기 위해, 동적 쿼리 대신 준비된 쿼리나 바인딩 변수를 사용합니다. 이를 통해 사용자의 입력이 코드로 실행되지 않도록 방어합니다.
  5. 적절한 권한 설정: 데이터베이스와 시스템에 대한 접근 권한을 최소화하여 인젝션 공격이 성공하더라도 피해를 줄일 수 있습니다.

ASP.NET Core Identity 적용 사례:

ASP.NET Core에서 쿼리 파라미터화는 기본적으로 Entity Framework Core와 함께 사용되어 SQL 인젝션 공격을 방지합니다. 예를 들어, 로그인 시 사용자가 입력한 데이터를 쿼리로 직접 전달하지 않고, 파라미터화된 방식으로 처리하여 Injection 공격을 예방할 수 있습니다.

var user = await _context.Users.SingleOrDefaultAsync(u => u.UserName == model.UserName);

Insecure Design

A04: 2021 – Insecure Design (취약한 설계)

설명

Insecure Design은 애플리케이션의 구조와 설계 단계에서 보안 요구사항을 고려하지 않거나 충분한 보안 조치를 포함하지 않은 경우 발생하는 취약점을 말합니다. 이는 보안 기능의 부재나 취약한 아키텍처로 인해 공격자가 애플리케이션의 취약점을 악용할 수 있는 상황을 초래합니다. Insecure Design은 보안 취약점 그 자체라기보다는 보안 관점에서 잘못 설계된 구조로 인해 발생하는 문제를 포괄하는 개념입니다.

주요 예시

  • 보안 요구사항 미반영: 설계 단계에서 인증, 인가, 데이터 암호화와 같은 기본적인 보안 요구사항이 포함되지 않음.
  • 취약한 암호화 설계: 민감한 데이터를 보호하기 위해 적절한 암호화 알고리즘을 사용하지 않거나, 암호화와 복호화 과정이 취약하게 설계됨.
  • 취약한 비즈니스 로직: 비즈니스 로직에서의 보안 결함으로 인해 공격자가 정상적인 비즈니스 흐름을 우회하거나 악용할 수 있음.
  • 서버 구성 미비: 서버 아키텍처 설계에서 과도한 권한 부여나 기본 설정 그대로 사용되어 공격자에게 서버 리소스를 노출함.
  • 공격 가능한 설계 요소: 보안 위험을 최소화하지 않은 API 설계 또는 사용자 입력을 제한 없이 허용하는 폼 등이 포함될 수 있음.

방어 방법

  1. 보안 요구사항 정의: 애플리케이션 설계 단계에서부터 보안 요구사항을 명확히 정의하고 이를 시스템 아키텍처와 설계에 반영합니다. 인증, 인가, 데이터 보호 등 핵심 보안 요소를 설계에 포함시킵니다.
  2. 위협 모델링 (Threat Modeling): 애플리케이션 개발 초기 단계에서 위협 모델링을 수행하여 잠재적인 공격 경로와 취약점을 분석하고, 이에 대한 대응 방안을 설계에 반영합니다.
  3. 보안 중심 설계 (Security by Design): 시스템의 모든 설계 단계에서 보안을 최우선으로 고려하여, 향후 발생할 수 있는 보안 결함을 미리 차단합니다. 예를 들어, 데이터 암호화, 보안 로그 저장, 세션 관리 등 필수적인 보안 기능을 설계에 포함시킵니다.
  4. 보안 테스트 통합: 설계 단계에서부터 코드 검토, 취약점 스캐닝, 침투 테스트와 같은 보안 테스트를 통합하여 보안 취약점이 설계에서부터 발생하지 않도록 예방합니다.
  5. 정기적인 설계 리뷰: 설계가 완료된 후에도 보안 요구사항을 주기적으로 검토하고 최신 보안 트렌드를 반영한 설계 리뷰를 수행하여, 보안 취약점이 설계 단계에서 발생하지 않도록 합니다.

ASP.NET Core Identity 적용 사례:

ASP.NET Core Identity는 기본적으로 강력한 인증 및 인가 메커니즘을 제공하여 보안 취약점을 최소화할 수 있습니다. **다중 인증(MFA)**을 통해 설계 단계에서부터 추가적인 보안 계층을 도입할 수 있으며, 이를 통해 사용자가 로그인을 할 때 추가적인 인증 단계를 적용할 수 있습니다.

public async Task<IActionResult> Verify2fa(string code)
{
    var result = await _signInManager.TwoFactorSignInAsync("Authenticator", code, isPersistent: false, rememberClient: false);
    if (result.Succeeded)
    {
        return

 RedirectToAction("Index", "Home");
    }
    return View();
}

Security Misconfiguration

A05: 2021 – Security Misconfiguration (보안 설정 오류)

설명

Security Misconfiguration는 시스템, 서버, 애플리케이션 또는 네트워크 장치가 잘못 설정되어 보안이 약화된 상태를 말합니다. 기본 설정 상태 그대로 시스템을 운영하거나, 불필요한 기능과 서비스가 활성화되어 있는 경우 이러한 취약점이 발생합니다. 보안 설정 오류는 공격자가 시스템에 쉽게 접근하거나 악용할 수 있도록 허용하며, 민감한 데이터가 노출되거나 시스템이 손상될 위험을 초래합니다.

주요 예시

  • 기본 설정 사용: 애플리케이션 또는 데이터베이스가 기본 관리자 계정/비밀번호를 사용하고 있으며, 공격자가 이를 통해 쉽게 접근 가능.
  • 불필요한 기능 활성화: 사용되지 않는 디버그 모드, 불필요한 서비스, 기능 또는 포트가 활성화된 상태로 시스템에서 실행 중인 경우.
  • 서버 및 애플리케이션의 최신 패치 미적용: 운영체제, 서버 소프트웨어, 라이브러리 등이 최신 보안 패치를 적용하지 않아 알려진 취약점이 공격에 노출됨.
  • 과도한 정보 노출: 오류 메시지를 통해 시스템 구조나 데이터베이스 정보를 과도하게 노출하여 공격자가 시스템을 분석할 수 있게 함.
  • 권한 설정 오류: 중요한 자원에 대한 접근 권한이 제대로 설정되지 않아 인증되지 않은 사용자가 민감한 정보에 접근 가능.

방어 방법

  1. 기본 설정 수정: 애플리케이션과 서버의 기본 설정(예: 관리자 계정과 비밀번호)을 변경하고, 최소한의 권한만 부여하여 불필요한 접근을 차단합니다.
  2. 불필요한 기능 비활성화: 사용하지 않는 기능, 서비스, 포트 등을 비활성화하고, 공격 표면을 최소화합니다.
  3. 정기적인 보안 패치: 운영체제, 웹 서버, 애플리케이션, 라이브러리 등에 대한 정기적인 업데이트와 보안 패치를 적용하여 최신 취약점을 차단합니다.
  4. 적절한 권한 관리: 중요한 데이터나 기능에 대한 접근 권한을 엄격하게 제한하고, 최소 권한 원칙을 적용하여 사용자와 시스템이 필요한 리소스에만 접근할 수 있도록 합니다.
  5. 오류 메시지 제한: 시스템의 내부 정보를 과도하게 노출하지 않도록 오류 메시지를 최소화하고, 사용자에게 불필요한 정보를 제공하지 않도록 설정합니다.
  6. 정기적인 보안 설정 검토: 보안 설정은 정기적으로 검토하고, 자동화된 도구를 사용하여 보안 설정 오류를 감지하고 수정하는 프로세스를 유지합니다.

ASP.NET Core Identity 적용 사례:

ASP.NET Core에서 보안 설정을 정확하게 구성하는 것이 중요합니다. 예를 들어, HTTPS를 강제하고, 쿠키의 Secure 플래그를 설정하여 중요한 데이터가 암호화되지 않은 연결을 통해 전송되지 않도록 합니다. AddHsts()를 사용해 HSTS를 설정하면 브라우저가 HTTPS 연결을 강제하게 됩니다.

public void ConfigureServices(IServiceCollection services)
{
    services.AddHsts(options =>
    {
        options.MaxAge = TimeSpan.FromDays(365);
        options.IncludeSubDomains = true;
        options.Preload = true;
    });
}

Vulnerable and Outdated Components

A06: 2021 – Vulnerable and Outdated Components (취약하거나 오래된 구성 요소)

설명

Vulnerable and Outdated Components는 사용 중인 소프트웨어, 라이브러리, 프레임워크, 모듈 등이 최신 버전이 아니거나 알려진 보안 취약점을 포함한 경우 발생하는 취약점입니다. 이러한 구성 요소는 공격자가 이미 알고 있는 취약점을 악용하여 시스템에 침투하거나 데이터를 유출하는 경로를 제공할 수 있습니다. 개발자나 운영자가 소프트웨어 구성 요소의 보안 업데이트를 적용하지 않으면, 시스템은 큰 위험에 노출될 수 있습니다.

주요 예시

  • 오래된 소프트웨어 사용: 중요한 보안 패치가 적용되지 않은 오래된 버전의 운영체제, 서버 소프트웨어 또는 애플리케이션을 사용하여 공격에 노출됨.
  • 취약한 라이브러리 사용: 애플리케이션에서 사용하는 외부 라이브러리가 보안 취약점을 포함하고 있음에도 최신 버전으로 업데이트되지 않음.
  • 불필요한 종속성 포함: 사용하지 않는 오래된 모듈이나 라이브러리가 프로젝트에 포함되어 있으며, 이 모듈이 취약점을 가지고 있음.
  • 보안 패치 미적용: 개발자가 알려진 취약점에 대한 보안 패치를 적용하지 않아 공격자가 이를 악용할 수 있는 환경이 됨.

방어 방법

  1. 최신 버전 유지: 사용하는 소프트웨어, 라이브러리, 프레임워크를 항상 최신 버전으로 유지하고, 보안 패치가 나오면 신속하게 적용합니다.
  2. 취약점 관리 프로그램 사용: 사용하는 모든 구성 요소를 추적하고, 알려진 취약점 데이터베이스(CVE, NVD 등)를 기반으로 취약점을 탐지 및 관리하는 프로그램을 사용하여 신속하게 대응합니다.
  3. 종속성 최소화: 프로젝트에서 불필요한 종속성이나 오래된 라이브러리는 제거하고, 사용되는 모든 모듈이 최신 보안 패치를 적용하도록 관리합니다.
  4. 자동화된 보안 검사 도구 사용: 자동화된 취약점 스캐너 또는 종속성 분석 도구를 사용하여 애플리케이션 빌드 과정에서 취약하거나 오래된 구성 요소를 탐지합니다.
  5. 서드파티 구성 요소에 대한 신뢰성 검증: 외부 소프트웨어나 라이브러리를 사용할 때는 반드시 신뢰할 수 있는 소스에서 받아야 하며, 최신 보안 업데이트가 적용된 상태인지 확인합니다.
  6. CI/CD 파이프라인에 보안 점검 통합: 지속적인 통합(CI) 및 배포(CD) 과정에서 구성 요소의 보안 점검을 자동화하여 취약한 구성 요소가 포함되지 않도록 합니다.

ASP.NET Core Identity 적용 사례:

ASP.NET Core Identity와 함께 사용되는 NuGet 패키지를 최신 상태로 유지하는 것이 중요합니다. dotnet-outdated와 같은 도구를 사용하여 모든 종속성의 최신 버전을 확인하고, 보안 패치를 놓치지 않도록 관리할 수 있습니다.

dotnet outdated

Identification and Authentication Failures

A07: 2021 – Identification and Authentication Failures (인증 및 세션 관리 실패)

설명

Identification and Authentication Failures는 애플리케이션이 사용자 식별과 인증 절차를 올바르게 처리하지 못할 때 발생하는 취약점입니다. 이로 인해 공격자가 사용자 계정에 무단으로 접근하거나, 세션을 탈취하여 시스템을 악용할 수 있습니다. 이러한 취약점은 취약한 비밀번호 정책, 세션 관리 오류, 다단계 인증(MFA)의 부재 등으로 인해 발생할 수 있습니다.

주요 예시

  • 약한 비밀번호 정책: 짧거나 예측 가능한 비밀번호를 허용하여 공격자가 손쉽게 사용자 계정에 접근할 수 있음.
  • 비밀번호 보호 실패: 비밀번호를 평문으로 저장하거나 약한 해시 알고리즘을 사용해 공격자가 쉽게 데이터를 탈취할 수 있음.
  • 다단계 인증 부재: 중요한 계정에 대한 추가적인 보안 단계(MFA)가 적용되지 않아 공격자가 계정을 쉽게 탈취할 수 있음.
  • 세션 고정 공격 (Session Fixation): 사용자가 로그인을 하기 전이나 후에 고정된 세션 ID를 사용함으로써, 공격자가 해당 세션을 악용할 수 있음.
  • 세션 하이재킹 (Session Hijacking): 세션 ID가 쉽게 추측되거나 탈취되어 공격자가 인증된 사용자로 가장할 수 있음.
  • 인증 우회: 인증 절차의 논리적 결함이나 설계 실수로 인해 공격자가 인증 절차를 우회하여 애플리케이션에 접근할 수 있음.

방어 방법

  1. 강력한 비밀번호 정책: 비밀번호는 최소 길이를 설정하고 복잡성을 강화하며, 정기적인 비밀번호 변경을 요구해야 합니다. 또한, 비밀번호 재사용을 방지하는 정책을 적용합니다.
  2. 안전한 비밀번호 저장: 비밀번호는 안전한 해시 알고리즘(Bcrypt, Argon2 등)을 사용하여 해싱하고, 솔트(Salt)를 추가하여 저장합니다.
  3. 다단계 인증(MFA) 도입: 중요한 계정 및 민감한 작업에 대해 다단계 인증(MFA)을 적용하여 계정 탈취의 위험을 줄입니다.
  4. 세션 보안 강화

: 세션 ID는 예측이 불가능한 난수로 생성하고, HTTPS를 사용하여 세션 ID가 안전하게 전송되도록 합니다. 세션 만료 시간과 로그아웃 시 세션 삭제 등을 통해 세션 보안을 강화합니다. 5. 세션 고정 방지: 로그인 시 새로운 세션 ID를 발급하여 세션 고정 공격을 방지하고, 로그인된 상태에서는 세션 ID를 지속적으로 갱신합니다. 6. 비밀번호 복구 절차 강화: 비밀번호 복구 시 이메일, SMS 인증, 또는 다른 방법을 사용하여 공격자가 비밀번호를 쉽게 재설정할 수 없도록 보호합니다. 7. 세션 만료 및 로그아웃 처리: 세션 타임아웃을 설정하여 일정 시간 동안 활동이 없으면 자동으로 로그아웃되도록 설정합니다.

ASP.NET Core Identity 적용 사례:

ASP.NET Core Identity에서 제공하는 비밀번호 정책을 강화할 수 있습니다. 예를 들어, 최소 비밀번호 길이와 복잡성 요구사항을 설정할 수 있으며, 잘못된 비밀번호 입력 시 일정 횟수 이상 실패하면 계정을 잠그는 기능도 제공합니다.

services.AddIdentity<ApplicationUser, IdentityRole>(options =>
{
    options.Password.RequireDigit = true;
    options.Password.RequiredLength = 8;
    options.Lockout.MaxFailedAccessAttempts = 5;
}).AddEntityFrameworkStores<ApplicationDbContext>();

Software and Data Integrity Failures

A08: 2021 – Software and Data Integrity Failures (소프트웨어 및 데이터 무결성 실패)

설명

Software and Data Integrity Failures는 소프트웨어 및 데이터의 무결성이 손상되는 경우 발생하는 취약점으로, 신뢰할 수 없는 소스에서 소프트웨어를 다운로드하거나, 업데이트가 검증되지 않은 상태에서 이루어질 때 발생합니다. 또한, 데이터의 무결성이 보장되지 않으면 공격자는 이를 악용해 악성 코드를 주입하거나 데이터를 변조할 수 있습니다. 특히, 자동화된 업데이트 메커니즘이나 CI/CD 파이프라인에서 신뢰할 수 없는 코드가 포함될 경우 이러한 문제가 발생할 수 있습니다.

주요 예시

  • 검증되지 않은 소프트웨어 업데이트: 소프트웨어가 신뢰할 수 없는 출처에서 자동으로 업데이트되거나, 업데이트 과정에서 무결성 검증이 수행되지 않아 악성 코드가 주입될 위험이 있음.
  • 신뢰할 수 없는 패키지 사용: 오픈소스나 서드파티 라이브러리를 다운로드할 때, 해당 패키지가 신뢰할 수 있는 출처에서 제공되지 않아 공격자가 악성 코드를 삽입할 수 있음.
  • CI/CD 파이프라인 공격: Continuous Integration/Continuous Delivery(CI/CD) 환경에서 보안 검증 없이 코드가 배포되면, 공격자가 악성 코드를 포함한 빌드를 배포할 수 있음.
  • 데이터 무결성 손상: 데이터가 전송 중에 변조되거나 손상되어, 중요한 정보가 왜곡되거나 악용될 수 있음.

방어 방법

  1. 디지털 서명 및 무결성 검증: 소프트웨어나 업데이트 파일에 디지털 서명을 적용하고, 다운로드 후 무결성 검증을 수행하여 데이터나 소프트웨어가 변조되지 않았음을 확인합니다.
  2. 신뢰할 수 있는 출처 사용: 오픈소스 및 서드파티 패키지는 신뢰할 수 있는 출처(예: 공식 리포지토리)에서 다운로드하고, 서명된 패키지만 사용하도록 설정합니다.
  3. CI/CD 파이프라인 보안 강화: CI/CD 파이프라인에서 배포되는 코드를 검증하고, 자동화된 보안 검사 도구를 통해 코드 무결성을 확인합니다. 또한, 파이프라인 접근 권한을 최소화하여 내부 및 외부 공격을 방지합니다.
  4. 보안 업데이트 정책 수립: 소프트웨어 및 패키지의 자동 업데이트는 검증된 소스에서만 이루어지도록 하고, 무결성 검증 및 서명된 업데이트를 적용하는 정책을 수립합니다.
  5. 전송 중 데이터 보호: 데이터 전송 시 무결성을 보장하기 위해 TLS/SSL과 같은 암호화된 통신 채널을 사용하고, 데이터 변조를 방지하기 위한 해시 또는 체크섬을 사용합니다.
  6. 안전한 코드 저장소 사용: 코드를 관리하는 저장소는 신뢰할 수 있고 안전한 환경에서 운영되도록 하며, 접근 제어를 통해 승인된 사용자만 코드에 접근하도록 합니다.

ASP.NET Core Identity 적용 사례:

ASP.NET Core Identity와 CI/CD 파이프라인에서 코드 서명무결성 검증을 적용하여 소프트웨어 무결성을 보장할 수 있습니다. 예를 들어, 모든 배포된 애플리케이션 코드에 대해 신뢰할 수 있는 소스로부터 서명된 패키지 및 코드만 배포되도록 설정할 수 있습니다.

dotnet nuget push --api-key <API_KEY> --source https://api.nuget.org/v3/index.json

Security Logging and Monitoring Failures

A09: 2021 – Security Logging and Monitoring Failures (보안 로깅 및 모니터링 실패)

설명

Security Logging and Monitoring Failures는 애플리케이션이나 시스템에서 발생하는 보안 이벤트를 적절히 기록(로깅)하거나 모니터링하지 못하여, 잠재적인 공격이나 악의적인 활동을 신속하게 탐지하고 대응하지 못하는 취약점입니다. 공격이 발생해도 시스템에서 이를 인지하지 못하거나, 로그가 충분히 기록되지 않아 공격 원인을 분석할 수 없는 경우가 이에 해당합니다. 이러한 취약점은 데이터 유출, 시스템 파괴 등의 심각한 피해를 발생시키며, 법적 및 규제적 요구 사항을 충족하지 못할 위험이 있습니다.

주요 예시

  • 중요 이벤트 로깅 누락: 인증 실패, 비정상적인 로그인 시도, 권한 초과 등의 중요한 보안 이벤트가 로그에 기록되지 않음.
  • 실시간 모니터링 부재: 시스템이 실시간으로 보안 로그를 모니터링하지 않아, 악의적인 활동을 즉시 탐지하지 못함.
  • 로그 보존 및 보호 실패: 로그 파일이 충분히 보관되지 않거나, 로그 파일이 공격자에 의해 수정 또는 삭제되어 공격의 흔적을 추적할 수 없음.
  • 알림 시스템 부재: 보안 사고가 발생했을 때 관리자가 알림을 받지 못해 빠르게 대응하지 못하는 경우.
  • 비정상적인 활동 탐지 실패: 비정상적인 트래픽 증가, 비정상적인 데이터베이스 쿼리 등 잠재적인 공격을 탐지하지 못함.

방어 방법

  1. 포괄적인 로깅 설정: 모든 중요한 보안 이벤트를 기록하도록 시스템을 구성해야 합니다. 인증 실패, 권한 초과 시도, 시스템 오류, 비정상적인 네트워크 활동 등의 이벤트가 로그에 기록되도록 설정합니다.
  2. 실시간 모니터링 도입: 로그를 실시간으로 모니터링할 수 있는 보안 정보 및 이벤트 관리(SIEM) 시스템을 도입하여, 보안 위협을 신속하게 탐지하고 대응할 수 있도록 합니다.
  3. 알림 및 경고 시스템 구축: 비정상적인 활동이 발생하거나, 보안 이벤트가 로그에 기록되면 관리자가 즉시 알림을 받을 수 있는 경고 시스템을 구축합니다.
  4. 로그 보호 및 보존: 로그 파일을 암호화하고, 무결성을 유지하며, 적절한 권한을 설정하여 공격자가 로그 파일을 변경하거나 삭제하지 못하도록 보호해야 합니다. 또한, 규제 요구 사항에 따라 로그 파일을 일정 기간 동안 보존해야 합니다.
  5. 정기적인 로그 검토 및 분석: 정기적으로 로그 파일을 검토하고 분석하여, 공격의 징후나 비정상적인 활동을 사전에 발견할 수 있도록 합니다. 이를 위해 자동화된 로그 분석 도구를 활용할 수 있습니다.
  6. 침입 탐지 및 방어 시스템 사용: IDS(침입 탐지 시스템) 및 IPS(침입 방지 시스템)를 도입하여, 네트워크와 시스템에서 발생하는 비정상적인 활동을 탐지하고 대응할 수 있도록 합니다.
  7. 로그 표준화 및 통합: 다양한 시스템과 애플리케이션의 로그를 표준화하고, 중앙화된 로그 관리 시스템을 통해 통합하여 분석할 수 있도록 합니다.

ASP.NET Core Identity 적용 사례:

로그와 모니터링은 보안 사고를 빠르게 감지하는 데 중요합니다. ASP.NET Core Identity는 SignInManager를 통해 로그인 시도 및 실패 이벤트를 기록할 수 있습니다. 예를 들어, 로그인 실패 시 로그를 남기고 관리자에게 알림을 보낼 수 있습니다.

_logger.LogWarning("Failed login attempt for user {User}", model.UserName);

Server-Side Request Forgery (SSRF)

**A10: 2021 – Server-Side Request Forg

ery (서버사이드 요청 위조)**

설명

Server-Side Request Forgery (SSRF)는 공격자가 서버가 의도하지 않은 원격 자원에 HTTP 요청을 보내도록 강제하는 취약점입니다. 공격자는 주로 신뢰할 수 있는 서버 내에서 발생하는 요청을 조작하여, 내부 네트워크에 있는 민감한 시스템에 접근하거나, 서버의 권한을 이용해 외부 자원에 비인가된 요청을 보내는 데 악용할 수 있습니다. 이는 클라우드 기반 서비스나 마이크로서비스 아키텍처에서 특히 위험할 수 있습니다.

주요 예시

  • 내부 네트워크 접근: 공격자가 SSRF를 통해 내부 IP 주소에 요청을 보내, 방화벽 뒤에 숨겨진 내부 네트워크 자원에 접근할 수 있음. 예를 들어, 데이터베이스 서버나 관리 콘솔에 접근할 수 있음.
  • 외부 자원 요청: 공격자가 서버를 통해 외부 웹사이트나 API에 요청을 보내고, 이를 통해 시스템 정보를 탈취하거나 DDoS 공격에 악용할 수 있음.
  • 클라우드 메타데이터 접근: 클라우드 환경에서 SSRF를 이용하여 클라우드 서비스의 메타데이터 서비스에 접근할 수 있음. 이를 통해 클라우드 인스턴스의 인증 토큰이나 중요한 설정 정보를 탈취할 수 있음.
  • 인증된 요청 위조: 서버가 내부 시스템에 대해 인증된 상태에서 요청을 수행할 수 있기 때문에, 공격자는 이를 이용해 인증된 사용자인 것처럼 민감한 자원에 접근할 수 있음.

방어 방법

  1. 허용된 대상 리스트 설정 (Allowlist): 서버에서 외부로 나가는 요청을 제한하고, 신뢰할 수 있는 도메인이나 IP 주소만 요청을 보낼 수 있도록 허용된 대상 리스트를 설정합니다.
  2. 사용자 입력 검증 및 제한: 사용자가 제공하는 입력값(특히 URL 또는 IP 주소)을 철저히 검증하고, 위험한 프로토콜(예: file://, ftp://, gopher://)이나 로컬 주소(127.0.0.1, localhost, 169.254.*.*)로 요청을 보내지 않도록 제한합니다.
  3. 네트워크 필터링 및 방화벽 설정: 내부 네트워크와 외부 네트워크 사이에 필터링 규칙을 적용하고, 방화벽을 사용하여 민감한 자원에 대한 접근을 차단합니다. 특히, 내부 IP 주소 범위에 대한 직접적인 접근을 차단하는 것이 중요합니다.
  4. 클라우드 메타데이터 접근 제한: 클라우드 서비스에서 제공하는 메타데이터 서비스에 대한 접근 권한을 엄격히 제한하고, 클라우드 인스턴스에서 메타데이터 API로의 요청을 검증하는 보안 설정을 적용합니다.
  5. HTTP 요청 메서드 및 헤더 제한: SSRF 공격을 방어하기 위해 서버가 처리할 수 있는 HTTP 메서드(GET, POST 등)와 헤더를 제한하고, 사용하지 않는 메서드는 비활성화합니다.
  6. 보안 모니터링 및 로깅: 서버 요청을 모니터링하여 의심스러운 요청을 탐지하고, SSRF 공격 시도를 빠르게 감지할 수 있도록 로그를 분석합니다.

ASP.NET Core Identity 적용 사례:

ASP.NET Core에서 외부 요청을 제어하기 위해 허용된 도메인만 접속하도록 설정할 수 있습니다. HttpClient의 요청을 제한하거나, Outgoing request policies를 적용하여 SSRF 공격을 방어할 수 있습니다. 또한, 클라우드 환경에서 인스턴스 메타데이터 접근을 차단할 수 있습니다.

var httpClient = new HttpClient();
httpClient.BaseAddress = new Uri("https://trusted-api.com");
// Allow requests only to trusted-api.com

OWASP Top 10 취약점 대응 전략

1. 보안 모범 사례 (Best Practices)

  • 최소 권한 원칙: 모든 사용자와 시스템이 필요한 최소한의 권한만 가질 수 있도록 설정
  • 입력 검증: 모든 사용자 입력은 반드시 검증되어야 하며, 허용 리스트 방식을 채택하여 예상치 못한 입력이 발생하지 않도록 방지
  • 정기적인 패치 및 업데이트: 모든 소프트웨어와 시스템은 최신 상태로 유지되고 보안 패치를 빠르게 적용
  • 보안 테스트 및 검토: 정기적으로 취약점 스캐닝, 코드 리뷰, 침투 테스트 등의 보안 테스트 수행

2. CI/CD 파이프라인 내 보안 적용 방안

  • 자동화된 보안 테스트 도구: CI/CD 파이프라인에 취약점 스캐닝 및 종속성 분석 도구를 통합하여, 배포 전 보안 취약점 확인
  • 코드 무결성 검증: 배포 전에 코드 서명 및 무결성 검증을 통해 신뢰할 수 없는 코드가 포함되지 않도록 관리

3. 보안 도구 및 자동화 사용법

  • OWASP ZAP: 웹 애플리케이션에서 발생할 수 있는 보안 취약점을 스캐닝하고 분석하는 도구
  • Burp Suite: 웹 애플리케이션의 보안 취약점을 탐지하고 진단하는 데 사용되는 유명한 도구
  • GitHub Dependabot: 프로젝트의 종속성을 자동으로 스캐닝하고, 취약점이 발견될 경우 이를 자동으로 업데이트

실습 세션 (선택 사항)

  1. 각 취약점에 대한 실습

    • 각 OWASP Top 10 취약점의 실제 사례를 시뮬레이션하고, 이를 통해 보안 위협을 체험
  2. 취약점 진단 도구 사용법

    • Burp SuiteOWASP ZAP과 같은 도구를 사용하여 웹 애플리케이션의 보안 취약점을 탐지하고 진단하는 방법 실습
  3. 취약점 해결을 위한 코드 리뷰 실습

    • 취약점이 있는 코드를 리뷰하고, 이를 수정하는 과정을 실습

Q&A 및 토론

  1. 질의응답

    • 강의 후 남은 질문에 대한 Q&A 시간 제공
  2. 실무 적용 사례 토론

    • 실무에서 OWASP Top 10을 어떻게 적용하는지 사례를 통해 설명하고 토론

강의 요약 및 마무리

  1. 주요 내용 요약

    • OWASP Top 10의 주요 취약점과 대응 방법 요약
  2. 향후 웹 애플리케이션 보안 트렌드

    • 최신 보안 트렌드와 향후 예상되는 웹 애플리케이션 보안 위협 소개
  3. OWASP 자원 및 커뮤니티 소개

    • OWASP 커뮤니티에 참여할 수 있는 방법과 다양한 자원 활용 방법 안내
VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com