잠그기
토큰, Cloudflare Access, 그리고 아무것도 없을 때.
서로 독립적인 문이 두 개 있습니다. 하나만 켜도 되고 둘 다 켜도 됩니다.
st # 시작할 때마다 새 토큰
SOPHONZ_ACCESS_TEAM=<team> SOPHONZ_ACCESS_AUD=<tag> st # 여기에 Cloudflare Access까지st는 토큰을 늘 켭니다. st가 띄우는 에이전트는 --token <비밀>(또는 SOPHONZ_TOKEN), --access-team, --access-aud(또는 SOPHONZ_ACCESS_TEAM, SOPHONZ_ACCESS_AUD)를 받고, 그 변수는 st를 시작한 환경에서 읽습니다. 둘 다 없으면 그 포트에 닿는 누구나 셸을 가집니다. 에이전트의 시작 화면이 그렇게 말하고, st는 에이전트를 그렇게 띄우지 않습니다.
공유 토큰
/?k=<token> 링크는 한 번 인증하고 즉시 쿠키로 교환됩니다. 비밀이 주소에도 로그에도 남지 않게 하기 위해서입니다. 쿠키가 없는 다른 주소는 401 대신 로그인 화면을 보여줍니다. 스크립트와 웹소켓은 그대로 401을 받습니다.
쿠키 서명 키는 토큰에서 파생됩니다. 서버를 재시작해도 폰이 로그아웃되지 않습니다. 같은 주소에서 반복해 틀리면 최대 5분까지 배로 늘어나는 지연이 걸립니다.
토큰으로 받은 쿠키는 30일, 장치 링크로 받은 쿠키는 12시간 갑니다. 다시 들어올 길은 링크이고 링크는 매번 계정을 확인하기 때문입니다. 세션 목록 화면이나 터미널의 세션 시트 맨 아래 sign out 을 누르면 그 브라우저의 쿠키가 지워집니다. sophonz.io에서 로그아웃해도 이 쿠키는 지워지지 않습니다 — 장치마다 따로 들고 있습니다.
Cloudflare Access
SOPHONZ_ACCESS_TEAM=<team> # <team>.cloudflareaccess.com (--access-team)
SOPHONZ_ACCESS_AUD=<tag> # Access 애플리케이션의 AUD (--access-aud)터널 자체의 신원 계층입니다. Access는 모든 요청에 서명된 JWT를 붙이고 에이전트가 그 JWT를 검증합니다. 터널 주소가 새어 나가도 주소만으로는 셸에 닿지 못합니다.
ttyd는 루프백에만
ttyd는 --url-arg 로 실행됩니다. 세션마다 프로세스를 띄우지 않고 하나가 모든 세션을 처리하기 위해서입니다. 대신 ttyd에 닿을 수 있으면 tmux 에 임의의 인자를 넘길 수 있다는 뜻이기도 합니다 — 그래서 ttyd는 루프백에만 묶이고, --check-origin 으로 실행되며, [A-Za-z0-9_-]{1,64} 에 맞지 않는 세션 이름은 프록시가 애초에 넘기지 않습니다.