사용 가이드

한국어

빠른 시작

# 파일 전송: 비밀번호가 자동 생성되고, 링크와 비밀번호가 출력됩니다
$ ttl send secret.pdf
No password provided. Generate one? [Y/n]:
Generated password: aB3kL9mXq7Rt
·✧★◉ Thank goodness, secret.pdf is in orbit (1.2 MB)
IMPORTANT! Save your password — required to download and decrypt the file.
Password: aB3kL9mXq7Rt
https://ttl.space/aBcDeFgHiJ

# 다운로드: 비밀번호를 대화형으로 입력합니다
$ ttl get https://ttl.space/aBcDeFgHiJ
Enter password: ********
Password verified
◉★✧· Phew, secret.pdf landed safe and sound (1.2 MB)

CLI가 자동으로 암호화, 업로드, 다운로드 및 복호화를 수행합니다. 서버는 비밀번호나 평문 데이터를 절대 볼 수 없습니다.

설치

Homebrew (macOS)

$ brew install tweenietomatoes/ttl/ttl

Scoop (Windows)

$ scoop bucket add ttl https://github.com/tweenietomatoes/scoop-ttl
$ scoop install ttl

미리 컴파일된 바이너리

# 릴리스에서 해당 플랫폼용 바이너리를 다운로드하세요
$ curl -Lo ttl.tar.gz \
  https://github.com/tweenietomatoes/ttl/releases/download/v1.6.0/ttl_1.6.0_linux_amd64.tar.gz
$ tar xzf ttl.tar.gz && sudo mv ttl /usr/local/bin/

Go install

$ go install github.com/tweenietomatoes/ttl/cmd/ttl@latest

소스에서 빌드

$ git clone https://github.com/tweenietomatoes/ttl
$ cd ttl && go build -o ttl ./cmd/ttl/
$ sudo mv ttl /usr/local/bin/

확인

$ ttl version
ttl 1.6.0

파일 전송

기본 전송

# 비밀번호 자동 생성, 기본 TTL 7일
$ ttl send report.xlsx

터미널에서 비밀번호를 지정하지 않으면 CLI가 다음과 같이 묻습니다:

No password provided. Generate one? [Y/n]:

Enter를 누르거나 y를 입력하면 자동으로 생성됩니다.

사용자 지정 비밀번호

$ ttl send -p mySecretPass -t 1h document.pdf

읽은 후 삭제

# 첫 번째 다운로드가 시작되는 순간 사용됩니다. 중단되면 그 다운로드만 이어서 받을 수 있습니다
$ ttl send -b photo.jpg

사용자 지정 TTL

$ ttl send -t 5m temp-credentials.txt   # 5분 후 만료
$ ttl send -t 30m meeting-link.txt      # 30분 후 만료
$ ttl send -t 6h backup.tar.gz          # 6시간 후 만료
$ ttl send -t 1d daily-report.pdf       # 1일 후 만료
$ ttl send -t 3d project-archive.zip    # 3일 후 만료
$ ttl send -t 5d design-assets.zip      # 5일 후 만료
$ ttl send report.xlsx                  # 7일 후 만료 (기본값)

파일 다운로드

대화형 (터미널)

$ ttl get https://ttl.space/aBcDeFgHiJ
Enter password: ********
Password verified
◉★✧· Phew, document.pdf landed safe and sound (4.2 MB)

비밀번호는 표시되지 않습니다. 원래 파일 이름이 유지되며, 출력 디렉토리에 같은 이름의 파일이 이미 있으면 덮어쓰지 않고 name (1).ext로 저장됩니다.

토큰만 사용

# 전체 URL 대신 10자리 토큰만 사용할 수도 있습니다
$ ttl get aBcDeFgHiJ

출력 디렉토리

$ ttl get -o ~/Downloads aBcDeFgHiJ

기본적으로 파일은 현재 디렉토리에 저장됩니다. -o / --output을 사용하여 다른 디렉토리를 지정하세요.

비밀번호 플래그 사용

$ ttl get -p mySecretPass https://ttl.space/aBcDeFgHiJ

브라우저

링크를 직접 방문하여 브라우저에서도 파일을 다운로드하고 복호화할 수 있습니다. 웹 인터페이스는 동일한 파일 형식과 알고리즘(Argon2id, XChaCha20-Poly1305)을 사용하며 비밀번호를 요청합니다. 소프트웨어 설치가 필요 없습니다.

비밀번호 관리

비밀번호는 암호화 키의 시드로 사용됩니다. 비밀번호는 기기를 떠나지 않으며 서버로 전송되지 않습니다. 비밀번호를 지정하는 방법은 여섯 가지가 있습니다:

1. 자동 생성 (전송 시에만)

$ ttl send notes.txt
No password provided. Generate one? [Y/n]: y
Generated password: aB3kL9mXq7Rt

[0-9A-Za-z]에서 암호학적으로 안전한 무작위 12자리 비밀번호를 생성합니다. send 시에만 사용 가능합니다 (대화형으로, 또는 --json 모드에서는 자동으로).

2. 대화형 입력

$ ttl send notes.txt
No password provided. Generate one? [Y/n]: n
Enter password: ********
Confirm password: ********

$ ttl get https://ttl.space/aBcDeFgHiJ
Enter password: ********

비밀번호가 표시되지 않으며 셸 히스토리에 기록되지 않습니다. send 시에는 먼저 자동 생성 여부를 선택합니다. get 시에는 바로 입력하라는 메시지가 표시됩니다.

3. 플래그: -p / --password

$ ttl send -p mySecretPass file.zip
$ ttl get --password mySecretPass https://ttl.space/aBcDeFgHiJ
-p / --password는 ps aux 출력에 표시되며 셸 기록(~/.bash_history)에 저장될 수 있습니다. 공유 환경과 스크립트에서는 사용을 피하세요. 대신 --password-stdin 또는 --password-file을 사용하세요.

4. 표준 입력: --password-stdin

# echo로 전달
$ echo "mySecretPass" | ttl send --password-stdin backup.tar.gz

# 비밀번호 관리자에서 전달
$ pass show ttl/key | ttl send --password-stdin data.zip

# 환경 변수에서 전달
$ printenv MY_SECRET | ttl get --password-stdin https://ttl.space/aBcDeFgHiJ

# Heredoc
$ ttl send --password-stdin report.pdf <<<"mySecretPass"

stdin에서 첫 번째 줄을 읽습니다. 스크립트, CI/CD 파이프라인, 자동화에 유용합니다. stdin이 터미널이 아니고 비밀번호 소스가 제공되지 않으면 CLI는 오류와 함께 종료됩니다 (--json 사용 시 제외, 이 경우 비밀번호가 자동 생성됩니다).

5. 파일: --password-file

$ ttl send --password-file /run/secrets/key report.xlsx
$ ttl get --password-file ~/.ttl-key https://ttl.space/aBcDeFgHiJ

파일의 첫 번째 줄을 읽습니다 (후행 줄바꿈 문자는 제거됩니다). Docker Secrets(/run/secrets/), Vault 에이전트 파일 등과 호환됩니다.

6. 자동 감지 파일: ttl.password

명시적인 비밀번호가 제공되지 않으면 CLI는 바이너리 옆의 ttl.password 파일을 검색한 다음 ~/.ttl/password를 검색합니다. 첫 번째 줄이 비밀번호로 사용됩니다.

한 번에 하나의 명시적 비밀번호 소스만 사용할 수 있습니다. -p / --password, --password-stdin, --password-file은 조합할 수 없습니다. 자동 감지되는 ttl.password 파일은 이들 중 아무것도 제공되지 않은 경우에만 확인됩니다. 최소 길이: 8자.

옵션 참조

Send 플래그

플래그설명기본값
-p, --password P암호화 비밀번호대화형
--password-stdinstdin에서 비밀번호 읽기
--password-file F파일에서 비밀번호 읽기
-t, --ttl DUR유효 기간7d
-b, --burn읽은 후 삭제 (일회성 다운로드)끔
-u, --uploader-only본인의 API 키로만 다운로드 가능 (Orbit; 별칭 --private)끔
--timeout DUR전송 타임아웃없음
--server URL서버 URLhttps://ttl.space
-h3, --http3HTTP/3 (QUIC) 시도, TCP로 폴백끔
--jsonstdout으로 JSON 출력 (스크립트 및 AI 에이전트용)끔

Get 플래그

플래그설명기본값
-p, --password P복호화 비밀번호대화형
--password-stdinstdin에서 비밀번호 읽기
--password-file F파일에서 비밀번호 읽기
-o, --output DIR출력 디렉토리현재 디렉토리
--timeout DUR전송 타임아웃없음
-h3, --http3HTTP/3 (QUIC) 시도, TCP로 폴백끔
--jsonstdout으로 JSON 출력 (스크립트 및 AI 에이전트용)끔

TTL 값

무료: 5m 10m 15m 30m 1h 2h 3h 6h 12h 24h 1d 2d 3d 4d 5d 6d 7d

Orbit 추가: 14d 15d 28d 30d permanent

타임아웃

기본값: 없음. 멈춘 전송은 자동으로 재개되며, 더 이상 진행할 수 없으면 중단됩니다. 제한을 두려면 --timeout 30m 또는 --timeout 2h를 사용하세요.

예제

스크립트: 백업 및 업로드

#!/bin/bash
tar czf /tmp/backup.tar.gz /data
echo "$BACKUP_KEY" | ttl send --password-stdin -t 6h /tmp/backup.tar.gz
rm /tmp/backup.tar.gz

링크를 클립보드에 복사 (macOS)

$ ttl send -p mypass123 file.pdf | pbcopy

링크를 클립보드에 복사 (Linux)

$ ttl send -p mypass123 file.pdf | xclip -sel clip

자동 삭제되는 일회용 비밀

$ echo "$DB_PASSWORD" | ttl send --password-stdin -b -t 5m credentials.env
# 링크는 정확히 한 번만 작동하며, 5분 후 만료됩니다

JSON 모드 (스크립트 & AI 에이전트)

# 전송: JSON 모드에서 비밀번호가 자동 생성됩니다
$ ttl --json send report.pdf
{"ok":true,"link":"https://ttl.space/xK9mQ2vLpA","filename":"report.pdf","size":2097152,"ttl":"7d","burn":false,"uploader_only":false,"is_permanent":false,"password":"aB3kL9mXq7Rt"}

# 다운로드
$ ttl --json get -p aB3kL9mXq7Rt xK9mQ2vLpA
{"ok":true,"filename":"report.pdf","size":2097152,"saved_to":"/home/user/report.pdf"}

# 오류는 ok:false를 반환합니다
{"ok":false,"error":"Link not found"}

--json 모드에서 모든 출력은 stdout의 구조화된 JSON입니다. 전송 시 비밀번호가 제공되지 않으면 자동으로 생성되어 응답에 포함됩니다. 종료 코드는 성공 시 0, 오류 시 1입니다.

Orbit 플랜

Orbit은 더 큰 파일(10 GB), 더 긴 보존 기간(30일 또는 영구), 업로더 전용 파일(본인의 API 키로만 다운로드 가능), 파일 관리(목록 및 삭제)를 제공합니다. 전체 비교: Features.

API 키는 자동 감지됩니다: TTL_API_KEY 환경 변수, 바이너리 옆의 ttl.key 또는 ~/.ttl/key. ttl activate로 키를 저장하거나 이 위치 중 하나에 수동으로 작성하세요.

# 키 활성화: 입력 내용이 화면에 표시되지 않으므로 셸 기록에 남지 않습니다
$ ttl activate
Enter Orbit API key: ********
Orbit plan activated. Key saved to /usr/local/bin/ttl.key
# 비대화형: ttl activate --key-stdin  |  ttl activate --key-file F

# 플랜 및 사용량 확인
$ ttl plan
Plan: orbit
Max file size: 10.0 GB
Max TTL: 30 days (or permanent)
Uploads per day: 1000000

Usage:
  Uploads today: 3
  Active storage: 1.2 GB / 500.0 GB

# 연장된 TTL로 전송
$ ttl send -t 30d large-backup.tar.gz
# 영구 파일 (Orbit 전용): 만료 없음, 직접 삭제하거나 구독이 종료될 때까지 보관됩니다
$ ttl send -t permanent archive.tar.gz
# 비공개 파일 전송: 본인의 API 키로만 다운로드할 수 있습니다 (Orbit 전용)
$ ttl send -u payroll.xlsx

# 최근 업로드 목록
$ ttl list
  xK9mQ2vLpA    4.2 MB  2026-03-16 10:30 → 2026-04-15 10:30  [active]
  https://ttl.space/xK9mQ2vLpA
  rT7bNw3KpF  912.0 KB  2026-03-15 14:20 → 2026-03-17 14:20  [active (burn)]
  https://ttl.space/rT7bNw3KpF

# 파일 조기 삭제
$ ttl delete xK9mQ2vLpA
Deleted: xK9mQ2vLpA

# 저장된 키 제거
$ ttl deactivate
Key file removed: /usr/local/bin/ttl.key

HTTP API

업로드 및 다운로드에는 CLI의 암호화 파이프라인(Argon2id + XChaCha20-Poly1305 + 청크 AEAD)이 필요합니다. 스크립트에는 ttl send / ttl get 또는 --json 모드를 사용하세요. 아래 엔드포인트는 Orbit 파일 관리용입니다.

파일 목록 (Orbit)

$ curl https://ttl.space/v1/files -H "X-API-Key: ttl_orbit_..."
{"files":[{"token":"xK9mQ2vLpA","link":"https://ttl.space/xK9mQ2vLpA","size_bytes":1048576,"created_at":1711800600,"expires_at":1714392600,"burn":false,"expired":false,"uploader_only":false,"is_permanent":false,"is_note":false,"perm_grace_until":0}],"has_more":false}

# 다음 페이지: has_more가 true일 때만; 이전 응답의 next_cursor를 전달합니다
$ curl "https://ttl.space/v1/files?cursor=1711800600123456" -H "X-API-Key: ttl_orbit_..."

이 키로 업로드된 파일을 최신순으로 페이지당 20개씩 반환합니다. has_more가 true이면 응답에 next_cursor도 포함되며, 이 값을 ?cursor=로 전달하면 다음 페이지를 가져옵니다. Orbit 플랜이 필요합니다.

파일 삭제 (Orbit)

$ curl -X DELETE https://ttl.space/v1/files/xK9mQ2vLpA -H "X-API-Key: ttl_orbit_..."

성공 시 204 No Content를 반환합니다. Orbit 플랜이 필요합니다. 파일은 이 키에 속해야 합니다.

오류 응답

상태의미
401유효하지 않거나 만료된 API 키
403기능에 Orbit 플랜이 필요합니다
404파일을 찾을 수 없거나 이 키에 속하지 않습니다
429요청 제한 초과
500내부 서버 오류, 나중에 다시 시도하세요
502스토리지를 일시적으로 사용할 수 없습니다, 나중에 다시 시도하세요

제한 사항

제한무료Orbit
최대 파일 크기2 GB10 GB
최대 TTL7일30일 또는 영구
일일 업로드10무제한
일일 업로드 용량 (IP당)10 GB무제한
동시 업로드IP당 1IP당 1, API 키당 1
스토리지 할당량✗500 GB
파일 목록✗✓
조기 삭제✓✓
업로더만 다운로드 가능한 파일✗✓
최소 비밀번호 길이8자
IP당 요청10초당 30
IP당 연결동시 10

암호화

파일은 업로드 전에 기기에서 암호화됩니다. 서버는 암호문만 저장하며 파일을 복호화할 수 없습니다.

구성 요소알고리즘 / 값
키 도출Argon2id (time=3, memory=64 MiB, parallelism=1)
암호XChaCha20-Poly1305 AEAD

암호문에 대한 어떤 수정이든 복호화 실패를 유발합니다. 서버는 암호화 키에서 파생된 단방향 토큰을 사용하여, 다운로드하는 사람이 올바른 비밀번호를 알고 있는지 확인한 후에 암호문을 제공합니다.