연습 모드
연습 모드는 취약한 코드를 식별하고 올바른 수정안을 선택하는 코드 리뷰 챌린지를 제공합니다. 여러 언어로 OWASP Top 10 (Web), OWASP API Top 10, OWASP Mobile Top 10 및 OWASP Client-Side Top 10을 다루는 200개 이상의 주제에 걸쳐 사용할 수 있습니다.
작동 방식
각 챌린지는 취약점 탐지와 수정 기술을 모두 테스트하도록 설계된 2단계 시스템을 따릅니다:
1단계 — 취약점 찾기
코드 스니펫을 읽고 보안 취약점이 포함된 블록을 식별합니다. 강조 표시된 여러 옵션 중 올바른 블록을 클릭하여 진행합니다.
2단계 — 수정안 선택
취약점을 식별하면 여러 옵션 중에서 올바른 수정안을 선택합니다. 각 옵션은 그럴듯해 보이지만, 보안 문제를 적절히 해결하는 것은 하나뿐입니다.
챌린지 인터페이스
일반적인 코드 리뷰 챌린지가 어떻게 보이는지 보여드립니다:
사용자 조회의 SQL Injection
backend / python / web
사용자 상세 정보 엔드포인트는 쿼리 문자열에서 id를 가져와 일치하는 행을 가져오는 데 사용합니다. 아래 후보 블록 중 하나는 신뢰해서는 안 되는 값을 신뢰합니다.
언어 선택
각 주제에는 여러 프로그래밍 언어의 챌린지가 있습니다. 스택 설정이 기본적으로 표시되는 언어를 결정합니다 — 백엔드 개발자는 Python, Java 또는 Go 챌린지를 보고, 프론트엔드 개발자는 React, Vue 또는 Angular 챌린지를 봅니다.
언어 선택기를 사용하여 언제든지 언어를 전환할 수 있습니다. 선호도가 저장되므로 항상 선호하는 스택의 챌린지를 먼저 볼 수 있습니다.
힌트 사용
각 단계에는 자체 힌트 버튼이 있습니다. 힌트를 사용하면 해당 단계에서 얻는 점수가 절반이 되며, 최소 10 XP가 됩니다 — 따라서 100 XP 가치의 깔끔한 첫 시도 단계가 힌트를 사용하면 50 XP가 되고, 60 XP 가치의 두 번째 시도 단계가 30 XP가 됩니다. 힌트는 답을 알려주지 않으면서 타깃 안내를 제공합니다 — 비판적으로 생각해야 하면서도 올바른 방향을 가리킵니다.
힌트는 선택 사항입니다. 익숙하지 않은 취약점 유형을 처음 접할 때 특히 도움이 됩니다.
채점 및 XP
각 단계는 독립적으로 채점됩니다. 첫 시도에서 정답이면 전체 단계 XP를 획득합니다. 반복된 잘못된 시도와 힌트 사용은 모두 이를 감소시킵니다.
| 단계 결과 | 힌트 없이 | 힌트 사용 |
|---|---|---|
| 1차 시도에서 정답 | 100 XP | 50 XP |
| 2차 시도에서 정답 | 60 XP | 30 XP |
| 3차 시도 이후 정답 | 30 XP | 15 XP |
| 챌린지당 최대 (양쪽 단계 첫 시도, 힌트 없음) | 200 XP | |
힌트 감소는 최소 10 XP의 50% 감소입니다. 따라서 힌트가 있는 3차 시도 단계라도 최소 10 XP를 획득합니다. 두 단계는 독립적으로 실행됩니다 — 1단계의 힌트나 잘못된 시도가 2단계에 영향을 주지 않습니다.
잘못 추측했을 때 일어나는 일
두 단계 중 첫 번째 잘못된 시도는 동일한 코드에서 다시 시도하라는 메시지를 표시합니다. 1단계에서 두 번째 잘못된 시도 후에는 다시 시도하기 전에 놓친 취약점의 실제 결과를 설명하는 짧은 스토리 대화 상자가 나타납니다. 시도 횟수 제한은 없습니다 — 계속 재시도할 수 있지만 세 번째 이후 각 추가 시도는 단계를 30 XP로 제한합니다.
챌린지 완료
양쪽 단계를 완료한 후 점수 분석을 확인할 수 있습니다:
1단계에서 2단계 흐름 읽기
2단계 구조는 취약점 탐지와 수정이 다른 기술이기 때문에 존재합니다. 1단계는 시각을 훈련합니다: 완전한 함수나 메서드가 주어지면 어느 라인이 위험한 라인입니까. 코드를 작성하라는 요청을 받는 것이 아니라, 리뷰어처럼 읽으라는 요청을 받는 것입니다. 취약한 라인은 구문적으로 가장 흥미로운 라인이 거의 아닙니다. 일반적으로 개발자가 생각 없이 작성하는 일을 하는 조용한 라인입니다. 예를 들어, 나중에 파싱될 문자열에 요청 매개변수를 연결하는 것입니다.
2단계는 판단을 훈련합니다. 문제가 어디에 있는지 알면 플랫폼은 여러 그럴듯한 수정안을 보여줍니다. 대부분은 컴파일되고, 실행되며, 합리적으로 보입니다. 하나만이 취약점을 완전히 닫습니다. 일부 옵션은 명백한 증상을 패치하면서 기본 프리미티브를 그대로 둡니다. 일부 옵션은 과도하게 수정하여 함수를 손상시킵니다. 2단계의 목표는 수정안이 원본보다 더 안전해 보이는지가 아니라, 왜 수정안이 작동하는지에 대해 추론하게 만드는 것입니다. 잘못된 답을 학습 가이드로 다루세요: 각각은 실제 개발자가 실제 풀 리퀘스트에서 저지르는 실제 실수입니다.
추측이 학습 곡선을 파괴하는 이유
힌트 시스템은 단계에 대한 XP를 절반으로 줄입니다(최소 10 XP). 이는 패널티처럼 들리지만 거래로 구성되어 있습니다. 거래는 더 낮은 점수에 대한 의미 있는 안내입니다. 힌트 없이 추측하면 동일한 XP가 들고 아무것도 가르치지 않습니다. 피드백 루프가 학습하기에는 너무 거칠기 때문입니다. 클릭하기 전에 스니펫을 30초 미만으로 읽는 자신을 발견한다면, 거의 확실히 추측하고 있는 것입니다. 속도를 늦추고, 스니펫을 두 번 읽고, 신뢰 경계가 어디에 있는지 가설을 세운 다음 클릭하세요.
새로운 취약점 클래스에 대한 올바른 리듬은 신중하게 읽고, 막혔을 때 힌트를 사용하며, 점수 감소를 학습 비용으로 받아들이는 것입니다. 동일한 클래스에서 3~4개의 챌린지 후에는 힌트가 필요하지 않게 됩니다. 10개 후에는 자신의 코드에서 동일한 패턴을 보기 시작합니다. 그 곡선은 추측으로 압축할 수 없습니다. 이러한 스니펫 뒤의 공격 체인에 대한 더 깊은 맥락을 원하시면 학습 모드의 일치하는 학습 시나리오를 시도해 보세요.