자체 WAF 구축하기

Shieldon 라이브러리의 공개 API를 활용하여 자체 웹 애플리케이션 방화벽(WAF)을 구축하고자 하는 경우, Shieldon 방화벽과 유사한 시스템을 생성할 수 있습니다.

다음은 Shieldon의 동작 방식을 보여주고 웹 애플리케이션에 수동으로 Shieldon을 구현하기 위한 안내를 제공하는 예제입니다.

생명주기 다이어그램

다음은 Shieldon 인스턴스의 생명주기를 보여주는 다이어그램입니다. 현재 당장 모든 것을 이해할 필요는 없지만, 컴포넌트와 CAPTCHA 모듈 등을 사용자 정의할 때 유용한 참고 자료로 활용될 것입니다.

생명주기 다이어그램

1. Shieldon 인스턴스 초기화

$kernel = new \Shieldon\Firewall\Kernel();

2. 데이터 드라이버 설정

이 예제에서는 데이터 드라이버로 SQLite를 사용합니다.

$dbLocation = APPPATH . 'cache/shieldon.sqlite3';
$pdoInstance = new \PDO('sqlite:' . $dbLocation);

$kernel->setDriver(
    new \Shieldon\Firewall\Driver\SqliteDriver($pdoInstance)
);

3. 컴포넌트 설정

Shieldon 컴포넌트는 세션을 영구적으로 허용하거나 거부하는 규칙 세트입니다.

이 예제에서는 TrustedBot 컴포넌트를 로드하여 인기 있는 검색 엔진을 허용하고, 이를 통해 해당 봇이 체크 과정에 진입하지 못하도록 방지합니다.

$kernel->setComponent(
    new \Shieldon\Firewall\Component\TrustedBot()
);

4. 채널 설정 (선택 사항)

웹 애플리케이션에서 하나의 Shieldon 커널 인스턴스만 사용하는 경우 이 설정을 무시할 수 있습니다. 채널은 데이터 테이블 이름의 접두사로 작동합니다.

$kernel->setChannel('web_project');

5. 온라인 세션 수 제한 (선택 사항)

이 설정은 현재 페이지를 보는 세션을 10개로 제한합니다. 기본 만료 시간은 300초입니다.

$kernel->limitSession(10, 300);

6. CAPTCHA 모듈 로드

Google reCAPTCHA와 같은 CAPTCHA 서비스를 설정할 수 있습니다.

$kernel->setCaptcha(
    new \Shieldon\Firewall\Captcha\Recaptcha([
        'key' => '6LfkOaUUAAAAAH-AlTz3hRQ25SK8kZKb2hDRSwz9',
        'secret' => '6LfkOaUUAAAAAJddZ6k-1j4hZC1rOqYZ9gLm0WQh',
    ])
);

7. 웹사이트 보호 시작

$result = $kernel->run();

if ($result !== $kernel::RESPONSE_ALLOW) {
    if ($kernel->captchaResponse()) {
        // 현재 세션의 블록을 해제합니다.
        $kernel->unban();
    }

    $response = $kernel->respond();

    if ($response->getStatusCode() !== 200) {
        $httpResolver = new \Shieldon\Firewall\HttpResolver();
        $httpResolver($response);
    }
}

이것으로 끝입니다.