aboutsummaryrefslogtreecommitdiffstats
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/design/017-apps-on-one-host.md31
1 files changed, 30 insertions, 1 deletions
diff --git a/docs/design/017-apps-on-one-host.md b/docs/design/017-apps-on-one-host.md
index 8498477..4fcc1df 100644
--- a/docs/design/017-apps-on-one-host.md
+++ b/docs/design/017-apps-on-one-host.md
@@ -287,7 +287,36 @@ HTTP로 앱을 더하는 길을 두지 않는 까닭은 인증이다. 그 길은
모양이 바뀌는 큰 목록은 목록을 다시 쓰는 동안).
- HTTP로 앱을 더하고 바꾸는 길. 경로의 인증(3b) 뒤에 따로 정한다.
-**3b: 경로의 인증.** 앱의 경로를 누가 부를 수 있는지다(CHECKPOINT의 남은 것). 3단계의 수명과 따로 설계한다.
+**3b: 경로의 인증.** 앱의 경로를 누가 부를 수 있는지다(CHECKPOINT의 남은 것). 지금은 누구나 부른다. 호스트가 루프백에서만
+듣는 것이 유일한 울타리다.
+
+- **토큰 파일.** `--apps`의 줄에 `tokens=FILE`(앱 하나의 호스트는 `--tokens FILE`). 줄마다 `권한 다이제스트`다. 다이제스트는
+ 토큰의 SHA-256(16진수 64자)이고, 파일에는 토큰 자체가 없다(파일이 새어도 토큰은 새지 않는다). 권한은 셋이다.
+ - `read`: 보기, 질의와 문서를 읽는다(GET).
+ - `write`: 위에 더해 입력에 보내고, 문서를 쓰고, 질의를 등록한다(POST, PUT).
+ - `input=이름[,이름…]`: 그 입력에만 보낸다(웹훅 하나에 토큰 하나).
+- **요청.** `Authorization: Bearer 토큰`. 토큰 파일이 있는 앱의 경로는 토큰을 요구한다. 없거나 모르는 토큰은 401
+ `unauthorized`(`WWW-Authenticate: Bearer`), 권한이 모자라면 403 `forbidden`이다. 토큰 파일이 없는 앱은 지금처럼 열려 있다.
+- **봉인된 전달은 토큰이 필요 없다.** 다른 노드의 출력이 봉인해 보낸 전달(`X-Pure-Seal`, 이 노드의 키로 열리고 `--sender`가
+ 이름을 대는 보내는 쪽의 것)은 키로 이미 인증됐다. 봉인 없는 전달은 토큰이 필요하다. 링크(UDP)는 그대로 키로 인증한다.
+- **비용.** 다이제스트는 상수 시간으로 견준다. 연결은 마지막 `Authorization` 값과 그 권한을 기억해, 같은 값이 다시 오면 해시하지
+ 않는다. SHA-256은 호스트 안에 둔다(OpenSSL을 불러오지 않는다).
+- **바꾸기.** 토큰 파일은 SIGHUP의 읽기마다 다시 읽는다. 토큰 파일만 바뀐 앱은 멈추지 않는다. 새 표로 바꿔 끼울 뿐이다.
+- `pure-serve --make-token 권한`은 새 토큰(무작위 32바이트, 16진수)과 파일에 넣을 줄을 낸다.
+- **하지 않는 것.** TLS: 호스트는 루프백에서 듣고, 밖으로는 TLS를 하는 앞단(Caddy 같은)이 잇는다. 사용자와 세션: 토큰은 앱을
+ 부르는 쪽(서비스, 웹훅, 앞단)의 것이고, 앱 안의 사용자는 앱의 상태다.
+
+## 3b의 착수 기준
+
+- **바꿀 결정:** 앱의 경로에 토큰을 요구할지다. 아래를 채우지 못하면 경로의 인증을 앞단에 맡긴다.
+- **최소 확인**(`tests/check.py`의 `server_tokens`, 앱 하나와 여러 앱의 호스트):
+ - 토큰 없이는 보기, 입력, 문서, 질의가 401이다. `read`는 보기와 질의와 문서 읽기만, `write`는 모두, `input=x`는 x에 보내기만
+ 된다. 거절된 쓰기는 아무것도 바꾸지 않는다.
+ - 다른 노드가 봉인해 보낸 전달은 토큰 없이 들어오고, 봉인 없는 전달은 토큰이 있어야 한다.
+ - 토큰 파일을 바꾸고 SIGHUP을 보내면 뺀 토큰은 401, 넣은 토큰은 200이다. 그동안 그 앱에 보낸 요청은 503을 받지 않는다.
+ - SHA-256이 알려진 답(FIPS 180-4의 예)과 같다. 토큰 파일이 없는 앱의 검사는 모두 그대로 초록이다.
+- **통과 조건**(RAM의 Pi 5): 토큰이 있는 앱의 보기(64연결, keep-alive)의 처리량 중앙값이 토큰 없는 같은 앱보다 3% 넘게 낮지 않다.
+ 요청마다 새 연결일 때 해시 하나의 값을 밝힌다.
### 3단계에서 알게 된 것