
SRTP(보안 실시간 전송 프로토콜)용 라이브러리
이 패키지는 Secure Real-time Transport Protocol(SRTP), Universal Security Transform(UST) 및 이를 지원하는 암호화 커널의 구현을 제공합니다. SRTP API는 include/srtp.h에 문서화되어 있으며, 라이브러리는 (컴파일 후) libsrtp2.a에 있습니다.
이 문서는 Cisco Systems, Inc.의 오픈 소스 Secure RTP 라이브러리인 libSRTP를 설명합니다. RTP는 Real-time Transport Protocol로, 전화, 오디오, 비디오와 같은 실시간 데이터 전송을 위한 IETF 표준이며 RFC 3550에 정의되어 있습니다. Secure RTP(SRTP)는 RTP 데이터에 기밀성을 제공하고 RTP 헤더와 페이로드에 인증을 제공하기 위한 RTP 프로필입니다. SRTP는 RFC 3711에 정의된 IETF 표준으로, IETF Audio/Video Transport(AVT) 워킹 그룹에서 개발되었습니다. 이 라이브러리는 SRTP의 모든 필수 기능을 지원하지만 선택 기능 전부를 지원하지는 않습니다. 자세한 내용은 지원 기능 섹션을 참조하십시오.
이 문서는 /doc/ 폴더의 문서 파일을 생성하는 데에도 사용되며, 여기에서 libSRTP API 및 관련 함수에 대한 더 상세한 참조 자료를 만들 수 있습니다(doxygen 설치 필요). 참조 자료는 일부 C 헤더 파일에 포함된 주석에서 자동으로 생성됩니다. 문서는 명확성을 높이기 위해 모듈별로 구성되어 있습니다. 이러한 모듈은 파일과 직접적으로 대응하지는 않습니다. 내부의 암호화 커널은 libSRTP의 기본 기능 중 상당 부분을 제공하지만, 백그라운드에서 작업을 수행하므로 대부분 문서화되어 있지 않습니다.
[email protected] 뉴스/공지/토론을 위한 일반 메일링 리스트입니다. 공개 리스트이며, 가입은 https://lists.packetizer.com/mailman/listinfo/libsrtp에서 확인하십시오.
[email protected] 보안 문제를 libsrtp 유지보수 팀에 공개하기 위한 주소입니다. 비공개 리스트이지만 누구나 보낼 수 있습니다.
libSRTP는 소스 코드 배포판에 포함된 다음 라이선스에 따라 배포됩니다. 다른 경로로 라이브러리를 받은 경우를 대비하여 이 매뉴얼에도 수록합니다.
Copyright (c) 2001-2017 Cisco Systems, Inc. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- Neither the name of the Cisco Systems, Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
libSRTP는 RTP 및 RTCP를 보호하는 함수를 제공합니다. RTP 패킷은 srtp_protect() 함수를 사용하여 암호화되고 인증되어 SRTP 패킷으로 변환될 수 있습니다. 마찬가지로 SRTP 패킷은 srtp_unprotect() 함수를 사용하여 복호화되고 인증이 검증되어 RTP 패킷으로 변환될 수 있습니다. 유사한 함수가 RTCP 패킷에도 보안을 적용합니다.
srtp_stream_t typedef는 SRTP 스트림과 관련된 모든 상태(암호 및 메시지 인증 함수의 키와 매개변수, 재생 방지 데이터 포함)를 보유하는 구조체를 가리킵니다. 특정 srtp_stream_t는 특정 RTP 및 RTCP 스트림을 보호하는 데 필요한 정보를 보유합니다. 이 데이터 유형은 libSRTP API와 구현을 더 잘 분리하기 위해 의도적으로 불투명하게 유지됩니다.
SRTP 세션 내에는 여러 스트림이 있을 수 있으며, 각 스트림은 특정 송신자로부터 시작됩니다. 각 소스는 자체적으로 시작하는 RTP 및 RTCP 스트림을 보호하기 위해 별도의 스트림 컨텍스트를 사용합니다. srtp_t typedef는 SRTP 세션과 관련된 모든 상태를 보유하는 구조체를 가리킵니다. 단일 srtp_t와 연관된 여러 스트림 컨텍스트가 있을 수 있습니다. 스트림 컨텍스트는 srtp_t와 독립적으로 존재할 수 없지만, 물론 단일 스트림 컨텍스트만 포함하는 srtp_t를 생성할 수는 있습니다. SRTP 세션에 참여하는 장치는 해당 세션의 각 소스에 대해 스트림 컨텍스트를 보유해야 각 송신자로부터 수신한 데이터를 처리할 수 있습니다.
libSRTP에서 세션은 srtp_create() 함수를 사용하여 생성됩니다. 세션에서 구현할 정책은 불투명한 srtp_policy_t 핸들로 이 함수에 전달됩니다. 단일 정책 핸들은 하나의 스트림 정책을 설명합니다. 여러 스트림을 구성하려면 세션을 만들고 srtp_stream_add()로 추가 정책을 추가하십시오.
정책 핸들은 srtp_policy_set_* 함수로 구성됩니다. 최소한 SSRC 선택, 프로필 선택, 키/솔트 자료가 포함됩니다. 프로필은 RTP/RTCP 암호화 정책 설정을 구성하고, SSRC 선택기는 해당 정책이 적용되는 방식과 위치를 식별합니다.
이 섹션에서는 SRTP를 검토하고 libSRTP에서 사용되는 몇 가지 용어를 소개합니다. RTP 세션은 한 쌍의 대상 전송 주소, 즉 네트워크 주소와 RTP 및 RTCP용 UDP 포트 쌍으로 정의됩니다. RTCP(RTP 제어 프로토콜)는 RTP 세션의 참가자 간 조정(예: 수신자에서 송신자로의 피드백 제공)에 사용됩니다. SRTP 세션도 유사하게 정의됩니다. 이는 SRTP 프로필이 사용되고 있는 RTP 세션일 뿐입니다. SRTP 세션은 SRTP 또는 SRTCP 대상 전송 주소로 전송되는 트래픽으로 구성됩니다. 세션의 각 참가자는 동기화 소스(SSRC) 식별자로 식별됩니다. 일부 참가자는 SRTP 트래픽을 전혀 보내지 않을 수 있습니다. 이들은 수신자 보고서와 같은 SRTCP 트래픽을 보내더라도 수신자라고 합니다.
RTP는 동일한 세션 동안 여러 소스가 RTP 및 RTCP 트래픽을 보낼 수 있도록 허용합니다. 동기화 소스 식별자(SSRC)는 이러한 소스를 구별하는 데 사용됩니다. libSRTP에서는 특정 소스의 SRTP 및 SRTCP 트래픽을 스트림이라고 합니다. 각 스트림에는 고유한 SSRC, 시퀀스 번호, 롤오버 카운터 및 기타 데이터가 있습니다. 옵션, 암호화 메커니즘 및 키의 특정 선택을 정책이라고 합니다. 세션 내의 각 스트림에는 서로 다른 정책을 적용할 수 있습니다.
주어진 세션의 모든 스트림에 단일 정책을 사용할 수 있지만, 단일 키가 여러 스트림에서 공유되는 경우에는 주의가 필요합니다. 키 공유를 사용할 때 스트림을 식별하는 SSRC 값은 반드시 서로 달라야 합니다. 이 요구 사항은 각 SRTP 및 SRTCP 키가 단일 송신자에 의해서만 암호화에 사용된다는 규칙을 사용하여 강제할 수 있습니다. 즉, 키는 특정 장치에서 시작된 스트림에서만 공유됩니다(물론 다른 SRTP 참가자는 복호화를 위해 키를 사용해야 합니다). libSRTP는 키가 인바운드 및 아웃바운드 데이터 모두에 사용되는 경우를 감지하여 이 강제를 지원합니다.
이 라이브러리는 SRTP의 구현 필수 기능 전체(RFC 3711에 정의된 대로)를 지원합니다. 이러한 기능 중 일부는 srtp_policy_t 핸들로 적절한 정책을 설정하여 런타임에 선택(또는 선택 해제)할 수 있습니다. 프로토콜의 다른 일부 동작은 예외 이벤트에 대한 적절한 이벤트 핸들러를 정의하여 조정할 수 있습니다. 생성된 문서의 SRTPevents 섹션을 참조하십시오.
SRTP 사양에 설명된 일부 옵션은 지원되지 않습니다. 여기에는 다음이 포함됩니다.
사용자는 이 라이브러리를 잘못 사용할 가능성이 있으며, 그 결과 제공되는 보안 수준이 부적절해질 수 있음을 인지해야 합니다. 이 라이브러리를 사용하여 기능을 구현하는 경우 RFC 3711의 Security Considerations 섹션을 읽어야 합니다. 또한 라이선스 및 면책 조항 섹션에 명시된 조건을 읽고 이해하는 것이 중요합니다.
이 라이브러리는 RFC 7714에 설명된 AES-GCM 인증 암호화 방식도 지원합니다.
libSRTP가 빌드될 때 사용할 3rd party(예: openssl/nss 등) 암호화 백엔드를 구성할 수 있습니다. 3rd party 백엔드가 설정되지 않으면 libSRTP는 AES 및 Sha1의 내부 구현을 제공합니다. 내부 구현은 AES-128 및 AES-256만 지원하므로 AES-192 또는 AES-GCM 암호 그룹을 사용하려면 3rd party 암호화 백엔드를 구성해야 합니다. 이러한 이유와 성능상의 이유로 3rd party 암호화 백엔드를 사용하는 것이 좋습니다.
srtp_protect() 함수는 rtp 패킷을 보유하는 버퍼에 인증 태그가 해당 패킷의 끝에 기록될 수 있을 만큼 충분한 저장 공간이 할당되어 있다고 가정합니다. 이 가정이 유효하지 않으면 메모리 손상이 발생합니다.
암호화 함수에 대한 자동화된 테스트는 cipher_type_self_test() 및 auth_type_self_test() 함수를 통해 제공됩니다. 이러한 함수는 이 코드를 새 플랫폼으로 포팅할 때마다 테스트하는 데 사용해야 합니다.
재생 방지는 암호화 엔진에 포함되어 있으며 이에 대한 테스트가 제공됩니다.
이 구현은 RTP 패킷을 초기화, 보호 및 보호 해제하는 호출을 제공하며, 이러한 함수가 어떻게 호출될지에 대해 가능한 한 적은 가정을 합니다. 예를 들어, 호출자가 패킷을 순서대로 제공할 것으로 기대하지 않습니다(단, 순서에서 65,000개 이상 벗어나면 동기화가 손실됩니다).
rtp 패킷의 시퀀스 번호는 송신자의 로컬 패킷 인덱스의 하위 16비트로 사용됩니다. RTP는 시퀀스 번호를 임의의 위치에서 시작하고 SRTP 계층은 첫 호출 시 해당 번호로 점프한다는 점에 유의하십시오. 이 라이브러리의 이전 버전은 32,768보다 작은 초기 시퀀스 번호를 사용했습니다. rdbx_estimate_index(...) 함수가 버전 1.0.1부터 더욱 스마트해졌으므로 이 방법은 더 이상 필요하지 않습니다.
(S)RTCP의 재생 창은 길이가 128비트로 하드코딩되어 있습니다.
libSRTP를 설치하려면 https://github.com/cisco/libsrtp/releases에서 배포판의 최신 릴리스를 다운로드하십시오. 가장 최신 릴리스를 받는 것이 좋습니다. 배포판의 압축을 풀고 소스 파일을 추출하십시오. 소스 파일이 위치할 디렉터리 이름은 libsrtp-A-B-C입니다. 여기서 A는 버전 번호, B는 메이저 릴리스 번호, C는 마이너 릴리스 번호입니다.
libSRTP는 GNU autoconf 및 make 유틸리티를 사용합니다(BSD make는 작동하지 않습니다. 플랫폼에 두 버전의 make가 모두 있다면 GNU make를 gmake로 호출할 수 있습니다.). libsrtp 디렉터리에서 configure 스크립트를 실행한 다음 make를 실행하십시오:~~~.txt
./configure [ options ]
make
configure 스크립트는 다음 옵션을 허용합니다:
옵션 | 설명
-------------------------------|--------------------
\-\-help \-h | 도움말 표시
\-\-enable-debug-logging | 모든 모듈에서 디버그 로깅 활성화
\-\-enable-openssl | OpenSSL 암호화 엔진 활성화
\-\-enable-nss | NSS 암호화 엔진 활성화
\-\-enable-openssl-kdf | OpenSSL KDF 알고리즘 활성화
\-\-enable-log-stdout | stdout으로 로깅 활성화
\-\-with-openssl-dir | OpenSSL 설치 위치
\-\-with-nss-dir | NSS 설치 위치
\-\-with-log-file | 로깅에 파일 사용
기본적으로는 로그 출력이 없으며, configure 옵션을 사용하여 stdout
또는 지정된 파일로 로그를 출력하도록 활성화할 수 있습니다.
이 패키지는 다음 플랫폼에서 테스트되었습니다: Mac OS X
(powerpc-apple-darwin1.4), Cygwin (i686-pc-cygwin), Solaris
(sparc-sun-solaris2.6), RedHat Linux 7.1 및 9 (i686-pc-linux), 그리고
OpenBSD (sparc-unknown-openbsd2.7).
--------------------------------------------------------------------------------
<a name="changing-build-configuration"></a>
## 빌드 구성 변경
위에서 언급한 `./configure` 스크립트를 빌드하기 위해 libSRTP는 [automake](https://www.gnu.org/software/automake/) 툴체인에 의존합니다. `./configure`는 automake가 `configure.in`에서 빌드하므로, `./configure`의 동작 방식을 변경(예: 새 라이브러리 의존성 추가)하려면 `./configure`를 다시 빌드하고 업데이트된 버전을 커밋해야 합니다. automake 자체 외에도 `pkgconfig` 도구가 설치되어 있어야 합니다.
예를 들어, macOS에서:```
brew install automake pkgconfig
# Edit configure.in
autoremake -ivf
```
<a name="using-visual-studio"></a>
## Visual Studio 사용
Windows에서는 CMake를 통해 Visual Studio를 사용할 수 있습니다. CMake는 여기에서 다운로드할 수 있습니다:
https://cmake.org/ . 예를 들어 Visual Studio 빌드 파일을 만들려면 다음 명령을
실행하십시오:```
# Create build subdirectory
mkdir build
cd build
# Make project files
cmake .. -G "Visual Studio 15 2017"
# Or for 64 bit project files
cmake .. -G "Visual Studio 15 2017 Win64"
```
<a name="using-meson"></a>
## Meson 사용하기
Windows를 포함한 모든 플랫폼에서 [Meson](https://mesonbuild.com)을 사용하여 빌드할 수 있습니다.
Meson을 다운로드하는 단계는 여기에서 확인할 수 있습니다: https://mesonbuild.com/Getting-meson.html
Meson으로 빌드하려면 다음과 같이 하면 됩니다:```
# Setup the build subdirectory
meson setup --prefix=/path/to/prefix builddir
# Build the project
meson compile -C builddir
# Run tests
meson test -C builddir
# Optionally, install
meson install -C builddir
```
Visual Studio로 빌드하려면 위의 명령을 Visual Studio 명령 프롬프트 안에서 실행하거나, 명령 프롬프트 안에서 적절한 인수와 함께 `vcvarsall.bat`를 실행하세요.
참고로 위의 명령을 적절한 `ninja` 타깃으로 대체할 수도 있습니다: `ninja -C build`, `ninja -C build test`, `ninja -C build install`.
--------------------------------------------------------------------------------
<a name="applications"></a>
# 애플리케이션
여러 테스트 드라이버와 간단하고 이식 가능한 srtp 애플리케이션이 `test/` 하위 디렉터리에 포함되어 있습니다.
Test driver | 테스트 기능
--------- | -------
kernel_driver | 암호화 커널 (암호, 인증 함수, rng)
srtp_driver | srtp 인메모리 테스트 (네트워크를 사용하지 않음)
rdbx_driver | rdbx (확장 재생 데이터베이스)
roc_driver | 확장 시퀀스 번호 함수
replay_driver | 재생 데이터베이스
cipher_driver | 암호
auth_driver | 해시 함수
`rtpw` 앱은 `/usr/dict/words`에서 단어를 읽은 다음 [s]rtp를 사용하여 한 번에 하나씩 전송하는 간단한 rtp 애플리케이션입니다.
수동 srtp 키 설정은 -k 옵션을 사용하며, gdoi를 사용한 자동 키 관리는 나중에 추가될 예정입니다.
사용법:~~~.txt
rtpw [[-d <debug>]* [-k|b <key> [-a][-e <key size>][-g]] [-s | -r] dest_ip dest_port] | [-l]
-s (발신자) 또는 -r (수신자) 옵션 중 하나를 선택해야 합니다. 그
값 dest_ip, dest_port는 각각 사전이 전송될 IP 주소와 UDP
포트입니다.
옵션은 다음과 같습니다:
키/솔트 쌍으로 사용할 무작위 30바이트 값을 얻으려면, 다음
bash 함수를 사용하여 /dev/random의 출력 형식을 지정할 수
있습니다(해당 장치를 사용할 수 있는 경우).~~~.txt
function randhex() {
cat /dev/random | od --read-bytes=32 --width=32 -x | awk '{ print $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 $16 }'
}
두 개의 rtpw 프로그램을 사용하는 SRTP 세션의 예는 다음과 같습니다:~~~.txt
set k=c1eec3717da76195bb878578790af71c4ee9f859e197a414a78d5abc7451
[sh1]$ test/rtpw -s -k $k -e 128 -a 0.0.0.0 9999
Security services: confidentiality message authentication
set master key/salt to C1EEC3717DA76195BB878578790AF71C/4EE9F859E197A414A78D5ABC7451
setting SSRC to 2078917053
sending word: A
sending word: a
sending word: aa
sending word: aal
...
[sh2]$ test/rtpw -r -k $k -e 128 -a 0.0.0.0 9999
security services: confidentiality message authentication
set master key/salt to C1EEC3717DA76195BB878578790AF71C/4EE9F859E197A414A78D5ABC7451
19 octets received from SSRC 2078917053 word: A
19 octets received from SSRC 2078917053 word: a
20 octets received from SSRC 2078917053 word: aa
21 octets received from SSRC 2078917053 word: aal
...
이 섹션에서는 libSRTP를 사용하는 간단한 예제를 제공합니다. 여기서는
get_rtp_packet() 및 send_srtp_packet() 함수를 사용할 수 있다고
가정합니다. 전자는 RTP 패킷을
버퍼에 넣고 해당 버퍼에 기록된 옥텟 수를 반환합니다. 후자는 길이를
두 번째 인자로 받아 버퍼에 있는 RTP 패킷을 전송합니다.~~~.c
srtp_t session;
srtp_policy_t policy;
// Set key/salt to predetermined values. uint8_t master_key[16] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}; uint8_t master_salt[14] = {0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D};
// Initialize libSRTP. srtp_init();
// Create and configure an opaque policy handle. srtp_policy_create(&policy); srtp_policy_set_ssrc(policy, (srtp_ssrc_t){ssrc_any_outbound, 0}); srtp_policy_set_profile(policy, srtp_profile_aes128_cm_sha1_80); srtp_policy_add_key(policy, master_key, sizeof(master_key), master_salt, sizeof(master_salt), NULL, 0);
// Allocate and initialize the SRTP session. srtp_create(&session, policy);
srtp_policy_destroy(policy);
// Main loop: get RTP packets, send SRTP packets. while (1) { char rtp_buffer[2048]; size_t rtp_len; char srtp_buffer[2048]; size_t srtp_len = sizeof(srtp_buffer);
rtp_len = get_rtp_packet(rtp_buffer); srtp_protect(session, rtp_buffer, rtp_len, srtp_buffer, &srtp_len); send_srtp_packet(srtp_buffer, srtp_len); }
srtp_dealloc(session); srtp_shutdown();
<a name="credits"></a>
# 크레딧
libSRTP의 원래 구현과 문서는 Secure RTP의 사용, 이해 및 상호 운용성을 장려하기 위해 Cisco Systems, Inc.의 David McGrew가 작성했습니다. Michael Jerris는 MSVC에서 빌드를 지원하는 데 기여했습니다. Andris Pavenis는 많은 중요한 수정 사항을 기여했습니다. Brian West는 동적 링크를 활성화하는 변경 사항을 기여했습니다. Yves Shumann은 문서 버그를 보고했습니다. Randell Jesup은 작동하는 SRTCP 구현 및 기타 수정 사항을 기여했습니다. Steve Underwood는 x86_64 이식성 변경 사항을 기여했습니다. 또한 Fredrik Thulin, Brian Weis, Mark Baugher, Jeff Chan, Bill Simon, Douglas Smith, Bill May, Richard Preistley, Joe Tardo 및 다른 분들의 기여, 의견 및 수정에 감사드립니다.
해당되는 경우, 이 문서의 참조 자료는 소스 코드 자동 문서화를 위한 doxygen 유틸리티를 사용하여 생성되었습니다.
Copyright 2001-2005 by David A. McGrew, Cisco Systems, Inc.
--------------------------------------------------------------------------------
<a name="references"></a>
# 참고 자료
SRTP 및 ICM 참고 자료
2005년 9월
Secure RTP는 [RFC 3711](https://tools.ietf.org/html/rfc3711)에 정의되어 있습니다.
카운터 모드 정의는 [섹션 4.1.1](https://tools.ietf.org/html/rfc3711#section-4.1.1)에 있습니다.
SHA-1은 [FIPS PUB 180-4](http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf)에 정의되어 있습니다.
HMAC은 [RFC 2104](https://tools.ietf.org/html/rfc2104)에 정의되어 있으며,
HMAC-SHA1 테스트 벡터는 [RFC 2202](https://tools.ietf.org/html/rfc2202#section-3)에서
확인할 수 있습니다.
SRTP에서 AES-GCM 사용은 [RFC 7714](https://tools.ietf.org/html/rfc7714)에 정의되어 있습니다.
| 옵션 | 설명 |
|---|
| -s | (S)RTP 발신자 - 앱이 단어를 전송하도록 함 |
| -r | (S)RTP 수신 - 앱이 단어를 수신하도록 함 |
| -k | SRTP 마스터 키 를 사용하며, 키는 16진수입니다 (앞의 "0x" 없이) |
| -b | -k와 같지만 base64로 인코딩된 키를 사용 |
| -e | 암호화/복호화 (데이터 기밀성용) (-k 옵션도 함께 사용해야 함) (keysize로 128, 192 또는 256을 사용) |
| -g | AES-GCM 모드 사용 (-e와 함께 사용해야 함) |
| -a | 메시지 인증 (-k 옵션도 함께 사용해야 함) |
| -l | 사용 가능한 디버그 모듈 나열 |
| -d | 모듈 에 대한 디버깅 켜기 |