사용 가이드

빠른 시작

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

비밀번호는 표시되지 않습니다. 원래 파일 이름이 복원됩니다.

토큰만 사용

# 전체 URL 대신 10자리 토큰만 사용할 수도 있습니다
$ ttl get aBcDeFgHiJ
Enter password: ********
Password verified
◉★✧· Phew, document.pdf landed safe and sound (4.2 MB)

출력 디렉토리

$ ttl get -o ~/Downloads aBcDeFgHiJ

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

비밀번호 플래그 사용

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

브라우저

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

비밀번호 관리

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

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

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

[0-9A-Za-z]에서 암호학적으로 안전한 무작위 8자리 비밀번호를 생성합니다. 터미널에서 send 시에만 사용 가능합니다.

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 / --passwordps 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읽은 후 삭제 (일회성 다운로드)
--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

타임아웃

기본값: 자동 — 1 Mbps 기준 파일 크기로 추정하며 2분의 여유를 추가합니다 (최소 5분). --timeout 10m 또는 --timeout 1h로 재정의할 수 있습니다.

예제

스크립트: 백업 및 업로드

#!/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,"password":"aB3kL9mX"}

# 다운로드
$ ttl --json get -p aB3kL9mX 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 키는 자동 감지됩니다: TTL_API_KEY 환경 변수, 바이너리 옆의 ttl.key 또는 ~/.ttl/key. ttl activate로 키를 저장하거나 이 위치 중 하나에 수동으로 작성하세요.

# 키 활성화
$ ttl activate ttl_orbit_aBcDeFgHiJ...
Orbit plan activated. Key saved to /usr/local/bin/ttl.key

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

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

# 연장된 TTL로 전송
$ ttl send -t 30d large-backup.tar.gz

# 최근 업로드 목록
$ 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}]}

이 키로 업로드된 모든 파일을 반환합니다. 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요청 제한 초과

제한 사항

제한무료Orbit
최대 파일 크기2 GB10 GB
최대 TTL7일30일
일일 업로드1050
스토리지 할당량250 GB
목록 및 삭제
최소 비밀번호 길이8자
IP당 요청10초당 30
IP당 연결동시 10

암호화

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

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

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