---
title: "세션 차단 가이드"
description: "워터마크 검출 시 AWS SNS, WAF, Lambda를 통한 세션 차단 구성 방법을 안내합니다."
---
> For the complete documentation index, see [llms.txt](/llms.txt).

import { Steps } from '@astrojs/starlight/components';

워터마크가 검출된 경우 해당 세션을 차단하여 해당 세션을 차단하는 기능을 적용할 수 있습니다. 이 가이드는 AWS SNS, WAF, Lambda를 활용한 세션 차단 시스템 구성 방법을 안내합니다.

```mermaid
sequenceDiagram
    participant U as 최종 사용자
    participant C as 클라이언트
    participant DR as 도브러너 클라우드
    
    box 클라이언트 인프라
    participant SNS as AWS SNS
    participant Lambda as AWS Lambda
    participant WAF as AWS WAF
    participant CF as CloudFront
    end
    
    C->>DR: 유출 의심 영상으로 워터마크 검출 요청
    Note over DR: 워터마크 분석 및 검출 처리
    DR->>DR: 워터마크 페이로드 검출 성공
    DR->>C: 검출된 토큰 정보 반환
    
    DR->>SNS: 세션 차단 메시지 발행
    Note right of SNS: {"site_id": "xxx", "revoke_token": "token"}
    
    SNS->>Lambda: 메시지 트리거
    Lambda->>Lambda: 메시지 파싱 및 검증
    Note right of Lambda: waf-uri-contains-{token} 규칙 생성
    Lambda->>WAF: WAF 규칙 생성/업데이트

    alt 차단된 토큰으로 요청
        Note over U,DR: ❌ 해당 토큰으로 접근하는 모든 요청 차단
        U->>WAF: 차단된 토큰으로 콘텐츠 요청
        WAF->>U: 접근 거부 (403 Forbidden)
    else 정상 토큰으로 요청
        U->>WAF: 정상 토큰으로 콘텐츠 요청
        WAF->>CF: 요청 통과
        CF->>U: 콘텐츠 제공
    end
```

## 세션 차단 전제 조건

세션 차단 기능을 사용하기 위해서는 다음 조건들이 미리 설정되어야 합니다:

- **라이브 검출 요청만 지원**
   - 세션 차단은 HLS를 사용하는 **라이브** 검출 요청에서만 지원됩니다.
   - VOD(Video on Demand) 검출 요청에서는 세션 차단이 지원되지 않습니다.

- **Session URL 또는 워터마크 토큰 발급 시 설정**
   - Session URL 발급 시 또는 워터마크 토큰 생성 시 `revoke_flag`를 `true`로 설정해야 합니다.
   - 이 플래그가 활성화되어야만 세션 차단 기능이 정상적으로 작동합니다.
   - [Session Manager API 가이드](../../embedding/session-manager/#session-url-api)에서 `revoke_flag` 파라미터를 참고하세요. 이 플래그를 활성화하면 Session URL/토큰 형식이 변경되니 유의하시기 바랍니다.

- **CloudFront Embedder 버전 요구사항**
   - CloudFront Embedder는 `2.9.0` 버전 이상을 사용해야 합니다.
   - 이전 버전에서는 세션 차단 기능이 지원되지 않습니다.
   - **이전 버전에서 업그레이드하는 경우:** [샘플 다운로드 페이지](/content-security/forensic-watermarking/getting-started/fwm-downloads/)에서 최신 패키지를 다운로드한 후, 기존 Lambda@Edge 함수의 `Code source`에 `.zip file`로 재업로드하고, `Publish new version`을 클릭한 다음, CloudFront 배포의 Lambda@Edge 연결을 새 버전 ARN으로 업데이트합니다. 자세한 업로드/게시 절차는 [CloudFront Embedder 가이드](../../embedding/cloudfront-embedder/)를 참고하세요.

- **인프라 설정 완료**
   - 아래 가이드에 따라 사용자 AWS 인프라에 세션 차단 설정이 완료되어야 합니다.
   - AWS SNS, WAF, Lambda 함수가 모두 올바르게 구성되고 연동되어야 합니다.

위 조건들이 모두 만족된 후에야 워터마크 검출 시 자동 세션 차단이 가능합니다.

:::note

본 문서에 작성된 내용은 향후 AWS 측의 업데이트에 따라 최신 버전의 AWS 콘솔 UI와 맞지 않게 될 수 있습니다. 실제 AWS 콘솔과 상이한 부분이나 잘못된 가이드 문서 링크가 있는 경우, [헬프데스크](https://support.doverunner.com)를 통해 문의해 주시기 바랍니다.

:::

## AWS 인프라에 세션 차단 설정하기

### 1. AWS SNS Notification 생성 및 등록

#### AWS SNS Topic 생성

<Steps>

1. **AWS Management Console에 로그인**
   - AWS 계정으로 로그인한 후 서비스 목록에서 SNS를 검색하여 선택합니다.
   
2. **Region 선택**
   - 우상단의 리전 드롭다운에서 원하는 리전을 선택합니다.
   - 리전은 제한이 없으므로 가장 가까운 리전이나 선호하는 리전을 선택하면 됩니다.
   - 단, 이후 생성할 Lambda 함수와 동일한 리전으로 설정해야 합니다.

3. **SNS Topic 생성**
   - SNS 대시보드에서 `Create topic` 버튼을 클릭합니다.
   - Type은 `Standard` 유형을 선택합니다.
   - Topic 이름을 입력합니다. (예: `doverunner-watermark-detection`)

4. **Access policy 섹션으로 이동**
   - Topic 생성 화면에서 `Access policy` 섹션을 찾습니다.

5. **Publishers 권한 설정**
   - `Choose method`에서 `Basic`을 선택합니다.
   - `Publishers` 항목에서 `Everyone`을 선택합니다.
   - 이는 DoveRunner 서비스가 SNS Topic에 메시지를 발행할 수 있도록 허용합니다.

6. **Topic 생성 완료**
   - `Create topic` 버튼을 클릭하여 Topic을 생성합니다.
   - 생성된 Topic의 ARN을 복사해둡니다.

7. **DoveRunner에 AWS SNS 등록**
   - 아래 두 가지 방식 중 하나를 선택하여 SNS를 등록합니다.

</Steps>

#### 방식 A: AWS Access Key ID / AWS Secret Key를 이용한 등록

<Steps>

1. **AWS Credential 준비**
   - AWS SNS에 접근할 수 있는 IAM 사용자의 AWS Access Key ID와 AWS Secret Key ID가 필요합니다.
   - IAM 사용자에게는 최소한 `SNS:Publish` 권한이 있어야 합니다.

2. **DoveRunner Console을 통한 AWS SNS 등록**
   - [DoveRunner Console](https://console.doverunner.com)에 로그인합니다. ([DoveRunner API](../watermark-detection-api/)를 통해서도 등록 가능합니다.)
   - `콘텐츠 보안` → `포렌식 워터마킹` → `설정` → `알림 설정` → `등록`으로 이동합니다.

    <img src="/img/content-security/watermark-detecting-sns-register-ko.png"
     alt="DoveRunner Console SNS Setting Page"
     width="900" />

3. **SNS 정보 입력**
   - **알림 이름**: 구분하기 쉬운 이름을 입력합니다.
   - **AWS IAM Role 권한 사용**: 체크박스 체크를 해지합니다.
   - **AWS ARN**: 앞서 생성한 SNS Topic의 ARN을 입력합니다.
   - **AWS Access Key ID**: IAM 사용자의 AWS Access Key ID를 입력합니다.
   - **AWS Secret Key**: IAM 사용자의 Secret Key를 입력합니다.
   - '저장' 버튼을 클릭하여 SNS 정보를 등록합니다.

</Steps>

#### 방식 B: AWS IAM Role ARN을 이용한 등록

AWS Access Key ID / AWS Secret Key 없이 IAM Role ARN을 이용하여 SNS를 등록할 수 있습니다.

<Steps>

1. **AWS SNS Access Policy에 DoveRunner Role 권한 추가**
   - 생성한 SNS Topic의 Access Policy에 DoveRunner IAM ARN으로부터 메시지를 받을 수 있도록 `sns:Publish` 권한을 추가합니다.
   - DoveRunner IAM ARN은 [헬프데스크](https://support.doverunner.com)를 통해 문의하여 전달받으실 수 있습니다.
      ```json
      {
        "Version": "2008-10-17",
        "Id": "__default_policy_ID",
        "Statement": [
          // ... 기존 정책 ...
          // DoveRunner Role 권한 추가
          {
            "Effect": "Allow",
            "Principal": {
              "AWS": "{{DoveRunner SNS Role ARN}}"
            },
            "Action": "sns:Publish",
            "Resource": "{{SNS Topic ARN}}"
          }
        ]
      }
      ```

2. **DoveRunner Console을 통한 AWS SNS 등록**
   - [DoveRunner Console](https://console.doverunner.com)에 로그인합니다. ([DoveRunner API](../watermark-detection-api/)를 통해서도 등록 가능합니다.)
   - `콘텐츠 보안` → `포렌식 워터마킹` → `설정` → `알림 설정` → `등록`으로 이동합니다.

3. **SNS 정보 입력**
   - **알림 이름**: 구분하기 쉬운 이름을 입력합니다.
   - **AWS IAM Role 권한 사용**: 체크박스 체크를 선택합니다.
   - **AWS ARN**: 앞서 생성한 SNS Topic의 ARN을 입력합니다.
   - '저장' 버튼을 클릭하여 SNS 정보를 등록합니다.

</Steps>

### 2. AWS WAF 생성 및 CloudFront 적용

#### AWS WAF 생성 전 준비사항

- **CloudFront 배포 확인**
   - AWS WAF를 적용할 CloudFront 배포가 미리 생성되어 있어야 합니다.
   - CloudFront는 글로벌 서비스이므로, AWS WAF도 Global (us-east-1) 리전에서만 생성 가능합니다.

- **필요한 권한 확인**
   - WAF 생성 및 CloudFront 연동을 위해 다음 권한이 필요합니다:
     - `wafv2:CreateWebACL`
     - `wafv2:UpdateWebACL` 
     - `cloudfront:UpdateDistribution`
     - `cloudfront:GetDistribution`

#### AWS WAF 생성 가이드

<Steps>

1. **AWS WAF 콘솔 접속**
   - AWS Management Console에서 'WAF & Shield' 서비스를 검색하여 이동합니다.
   - 좌측 메뉴에서 `Web ACLs`를 선택합니다.

2. **Web ACL 생성**
   - `Create web ACL` 버튼을 클릭합니다.
   - `Web ACL details`의 `Resource type`에서 `Global resources`를 선택합니다.
   - Web ACL 이름을 입력합니다. (예: `DoveRunner-Session-Revoke-ACL`)

3. **CloudFront 배포 연결**
   - `Associated AWS resources` 섹션에서 `Add AWS resources` 버튼을 클릭합니다.
   - WAF를 적용할 CloudFront 배포를 선택합니다.
   - `Add` 버튼을 클릭하여 연결합니다.

5. **기본 설정으로 Web ACL 생성**
   - `Add rules and rule groups` 단계에서 아무것도 추가하지 않고 `Next`를 클릭합니다.
   - `Set rule priority` 단계도 기본 설정으로 `Next`를 클릭합니다.
   - `Configure metrics` 단계도 기본 설정으로 `Next`를 클릭합니다.
   - `Review and create` 단계에서 설정을 검토한 후 `Create web ACL`을 클릭합니다.

6. **연동 확인**
   - Web ACL 생성이 완료되면, CloudFront 콘솔로 돌아가서 해당 배포의 `Security` 탭을 확인합니다.
   - `Security - Web Application Firewall (WAF)`에 방금 생성한 Web ACL이 연결되어 있는지 확인합니다.

7. **WebACL 정보 저장**
   - 연동을 확인했다면, 'WAF & Shield' 서비스로 다시 이동하여, `Web ACLs`로 이동합니다.
   - Region을 `Global`로 설정한 후, 생성된 WebACL의 `Name`과 `ID`를 복사하여 저장합니다.
   - 이 정보는 Lambda 함수의 설정 파일에서 사용됩니다.

</Steps>

### 3. AWS Lambda Function 생성

#### Lambda IAM 권한과 실행 역할 생성

Lambda@Edge를 구성하기 위해서는 우선 해당 기능에 필요한 IAM 권한과 실행 역할을 생성해야 합니다.

<Steps>

1. **Lambda Policy 생성**
    - AWS Management Console에서 **IAM** 서비스로 이동합니다.
    - 좌측 메뉴에서 **정책(Policies)** 를 선택한 후, **정책 생성(Create policy)** 버튼을 클릭합니다.
    - **JSON** 탭을 선택하고 아래 정책 내용을 복사하여 붙여넣습니다.
      ```json
      {
         "Statement": [
            {
                  "Action": [
                     "wafv2:GetWebACL",
                     "wafv2:UpdateWebACL"
                  ],
                  "Effect": "Allow",
                  "Resource": "*"
            },
            {
                  "Action": [
                     "logs:CreateLogGroup",
                     "logs:CreateLogStream",
                     "logs:PutLogEvents"
                  ],
                  "Effect": "Allow",
                  "Resource": "arn:aws:logs:*:*:*"
            }
         ],
         "Version": "2012-10-17"
      }
      ```

2. **Trust Relationship 설정**
    - 생성한 role의 `Trust Relationship` 탭에 아래 역할을 추가합니다.
      ```json
      {
         "Version": "2012-10-17",
         "Statement": [
            {
                  "Effect": "Allow",
                  "Principal": {
                     "Service": [
                        "lambda.amazonaws.com",
                        "edgelambda.amazonaws.com"
                     ]
                  },
                  "Action": "sts:AssumeRole"
            }
         ]
      }
      ```

</Steps>

#### Lambda 함수 생성

> 설정에 필요한 람다 파일은 [샘플 다운로드 페이지](../../getting-started/fwm-downloads/)에서 다운로드 받을 수 있습니다.

<Steps>

1. **Lambda 함수 생성 시작**
   - Lambda 대시보드에서 `Create function` 버튼을 클릭합니다.
   - 이전에 생성한 SNS Topic과 동일한 리전으로 생성해야 합니다.
   - `Author from scratch` 옵션을 선택합니다.

2. **기본 정보 입력**
   - **Function name**: 이름을 입력합니다. (예: `DoveRunner-Session-Revoke-Function`)
   - **Runtime**: Node.js 22.x 또는 최신 버전을 선택합니다.
   - **Architecture**: x86_64를 선택합니다.

3. **실행 역할 설정**
   - `Change default execution role`을 클릭합니다.
   - `Use an existing role`를 선택합니다.
   - 이전 단계에서 생성한 IAM 실행 역할을 적용합니다.

4. **함수 생성 완료**
   - `Create function` 버튼을 클릭하여 함수를 생성합니다.
   - 생성이 완료되면 함수 상세 페이지로 이동합니다.

</Steps>

#### SNS 트리거 추가 및 소스 코드 업로드

<Steps>

1. **트리거 추가**
   - Function overview 섹션에서 `+ Add trigger` 버튼을 클릭합니다.
   - 트리거 소스로 `SNS`를 선택합니다.

2. **SNS Topic 선택**
   - `SNS topic` 드롭다운에서 앞서 생성한 SNS Topic을 선택합니다.
   - `Add` 버튼을 클릭하여 트리거를 추가합니다.

3. **코드 업로드 준비**
   - Lambda 함수 상세 페이지에서 `Code` 탭을 클릭합니다.
   - `Upload from` 드롭다운에서 `.zip file`을 선택합니다.

4. **ZIP 파일 업로드**
   - 제공된 `lambda-wm-revoke-token-v1.0.0.zip` 파일을 업로드합니다.
     - [lambda-wm-revoke-token-v1.0.0.zip](/files/lambda-wm-revoke-token-v1.0.0.zip)
   - 이 ZIP 파일에는 다음 파일들이 포함되어 있습니다:
     - `index.js`: 메인 Lambda 핸들러 함수
     - `config.js`: 설정 파일 (수정 필요)
     - `constants.js`: 상수 정의 파일
     - `package.json`: 의존성 정보

5. **업로드 완료**
   - ZIP 파일을 선택하고 `Save` 버튼을 클릭합니다.
   - 업로드가 완료되면 코드 에디터에서 파일들을 확인할 수 있습니다.

</Steps>

### 3. 설정 파일

#### `config.js` 설정 파일 수정

<Steps>

1. **config.js 파일 수정**
   - 코드 에디터에서 `config.js` 파일을 열어 다음 내용을 수정합니다:
      ```json
      {
      "site_id": "{Your DoveRunner Site ID}",
      "account_id": "{Your DoveRunner Account ID or Email}",
      "access_key": "{Your DoveRunner Access Key}",
      "aws_waf_web_acl_id": "{Your AWS WAF WebAcl ID}",
      "aws_waf_web_acl_name": "{Your AWS WAF WebAcl Name}"
      }
      ```

2. **설정 저장 및 배포**
   - 모든 설정 파일 수정이 완료되면 `Deploy` 버튼을 클릭합니다.
   - 배포가 완료되면 함수가 새로운 설정으로 실행됩니다.

</Steps>

### 4. Lambda 및 SNS, WAF 연동 테스트

#### AWS SNS에서 직접 Message Publish를 통한 테스트

<Steps>

1. **SNS 콘솔로 이동**
   - AWS Management Console에서 SNS 서비스로 이동합니다.
   - 앞서 생성한 SNS Topic을 선택합니다.

2. **메시지 발행 준비**
   - Topic 상세 페이지에서 `Publish message` 버튼을 클릭합니다.
   - Subject는 선택사항이므로 비워둬도 됩니다.

3. **Message Body 작성**
   - Message format은 `JSON`을 선택합니다.
   - Message body에 다음과 같은 테스트 메시지를 입력합니다:
      ```json
      {
      "site_id": "{Your DoveRunner Site ID}",
      "revoke_token": "test-token"
      }
      ```

4. **메시지 발행**
   - `Publish message` 버튼을 클릭하여 메시지를 발행합니다.
   - 성공적으로 발행되면 Lambda 함수가 자동으로 트리거됩니다.

</Steps>

#### 연동 확인 방법

<Steps>

1. **CloudWatch Logs를 통한 Lambda 실행 로그 확인**
   - AWS Management Console에서 CloudWatch 서비스로 이동합니다.
   - 좌측 메뉴에서 `Logs` → `Log groups`를 선택합니다.
   - `/aws/lambda/[Lambda함수이름]` 형태의 Log group을 찾아서 클릭합니다.
   - 가장 최근 Log stream을 선택하여 실행 로그를 확인합니다.
   - 정상적으로 실행되었다면 다음과 같은 로그를 확인할 수 있습니다:
     - SNS 메시지 수신 로그
     - WAF 규칙 업데이트 요청 로그
     - 성공/실패 결과 로그

2. **AWS WAF에서 규칙 생성 확인**
   - AWS Management Console에서 `WAF & Shield` 서비스로 이동합니다.
   - `Web ACLs`를 선택 및 Global Region 으로 변경 후, 생성한 Web ACL을 클릭합니다.
   - `Rules` 탭에서 새로운 규칙이 생성되었는지 확인합니다.
   - 규칙 이름은 일반적으로 `waf-uri-contains-{test-token}` 형태로 생성됩니다.
   - 규칙의 Action이 `Block`으로 설정되어 있는지 확인합니다.

</Steps>

## 문제 해결

### Lambda 함수가 실행되지 않는 경우

- SNS 트리거가 올바르게 설정되었는지 확인합니다.
- Lambda 함수의 실행 역할에 필요한 권한이 있는지 확인합니다.
- SNS Topic과 Lambda 함수가 동일한 리전에 있는지 확인합니다.

### WAF 규칙이 생성되지 않는 경우

- CloudWatch Logs에서 에러 메시지를 확인합니다.
- Lambda 실행 역할에 `wafv2:UpdateWebACL` 권한이 있는지 확인합니다.
- `config.js` 파일의 WAF 설정 정보가 올바른지 확인합니다.

### 세션 차단이 작동하지 않는 경우

- WAF 규칙이 올바르게 생성되었는지 확인합니다.
- CloudFront 배포가 WAF와 연결되어 있는지 확인합니다.
- 실제 발행된 토큰이 WAF 규칙과 일치하는지 확인합니다.