---
name: 크라우니계정
description: 크라우니 통합계정(id.crowny.org) 셀프서비스 — "로그인해줘", "크라우니 로그인", "내 계정 보여줘", "비밀번호 바꿀래", "로그아웃" 요청 시 사용. 비밀번호는 사용자가 직접 입력하고 세션은 ~/.crowny 에만 저장한다.
---

# 크라우니계정 — id.crowny.org 셀프서비스 (v3, 2026-09-30)

설치(사용자 클로드코드에서 1회):

```bash
mkdir -p ~/.claude/skills/크라우니계정 && curl -fsSL https://id.crowny.org/skill.md -o ~/.claude/skills/크라우니계정/SKILL.md
```

## 원칙
- 비밀번호는 **사용자가 직접** 입력한다. 대화·로그·명령행 인자·셸 히스토리에 남기지 않는다.
  요청 본문은 권한 600 임시파일에 쓰고 `--data-binary @파일`로 보낸 뒤 즉시 지운다.
- 세션 토큰은 `~/.crowny/id-session.json`(600), 아이디는 `~/.crowny/id.txt` 에 기억한다.
- 응답 판독: `{"ok":true,...}` = 성공. 401 = 아이디/비밀번호 오류. 429 = 잠시 후 재시도. 502 = 계정 서버(IdP) 연결 불가.
- 기본 서버 `https://id.crowny.org`. 크라우니 기기 내부라면 `http://127.0.0.1:9436` 도 같다.

## "로그인해줘"
1. 아이디: 사용자가 말했으면 그것. 아니면 `~/.crowny/id.txt`. 둘 다 없으면 한 번만 묻는다. (예: `sh`, 이메일 `sh@crowny.org` 도 허용)
2. 비밀번호: 사용자가 준 값을 그대로 쓴다. 화면에 되풀이해 보여주지 않는다.
3. 실행:

```bash
ID='<아이디>'; mkdir -p ~/.crowny && chmod 700 ~/.crowny && printf '%s' "$ID" > ~/.crowny/id.txt
T=$(mktemp) && chmod 600 "$T"
cat > "$T" <<'JSON'
{"id":"<아이디>","password":"<비밀번호>"}
JSON
curl -sS -X POST https://id.crowny.org/api/id/login -H 'Content-Type: application/json' --data-binary @"$T" -o ~/.crowny/id-session.json -w 'HTTP %{http_code}\n'
rm -f "$T"; chmod 600 ~/.crowny/id-session.json
```

4. `HTTP 200` 이고 파일에 `"ok":true` 가 있으면 로그인 성공. 이어서 내 정보를 보여준다(아래).
   401 이면 "아이디 또는 비밀번호가 틀립니다" 라고만 알리고 비밀번호를 다시 받는다.

## "내 계정 보여줘"

```bash
TOK=$(sed -n 's/.*"token":"\([^"]*\)".*/\1/p' ~/.crowny/id-session.json)
curl -sS https://id.crowny.org/api/id/me -H "X-Session: $TOK"
```

응답 예: `{"ok":true,"id":"...","loginId":"sh","email":"sh@crowny.org","name":"정승현","role":"user","status":"active",...}`
401 이면 세션 만료 — "로그인해줘" 절차부터 다시.

## "비밀번호 바꿀래"
1. 세션이 없으면 먼저 로그인 절차.
2. 새 비밀번호를 **두 번** 받아 일치와 6자 이상을 확인한다.
3. 실행:

```bash
TOK=$(sed -n 's/.*"token":"\([^"]*\)".*/\1/p' ~/.crowny/id-session.json)
T=$(mktemp) && chmod 600 "$T"
cat > "$T" <<'JSON'
{"password":"<새 비밀번호>"}
JSON
curl -sS -X POST https://id.crowny.org/api/id/password -H 'Content-Type: application/json' -H "X-Session: $TOK" --data-binary @"$T" -w '\nHTTP %{http_code}\n'
rm -f "$T"
```

4. `{"ok":true,"changed":true}` 면 변경 완료. 곧바로 **새 비밀번호로 "로그인해줘" 절차를 한 번 더** 실행해 확인하고 세션 파일을 갱신한다.
   확인 로그인이 401 이면 "변경은 됐지만 확인 로그인 실패" 로 정직하게 보고한다.

## "로그아웃"

```bash
TOK=$(sed -n 's/.*"token":"\([^"]*\)".*/\1/p' ~/.crowny/id-session.json)
curl -sS -X POST https://id.crowny.org/api/id/logout -H "X-Session: $TOK"; rm -f ~/.crowny/id-session.json
```

## 크라우니 기기(한선씨 실행기가 있는 경우)
비밀번호는 표준입력 한 줄로 받는다. 명령행 인자로 넘기지 않는다.

```bash
C=/Users/ef/CrownyOS/crownyc/crownyc; T=/Users/ef/crowny-id/도구/크라우니계정.toau
$C run $T 로그인 sh        # 비밀번호 1줄 입력
$C run $T 내정보
$C run $T 비번변경          # 새 비밀번호 2줄 입력(확인)
$C run $T 로그아웃
```

## 라우트 요약 (id.crowny.org → IdP :9610)
| 요청 | 인증 | 본문 | 성공 |
|---|---|---|---|
| POST /api/id/login | 없음 | {id 또는 email, password} | 200 {ok,token,idpToken,email,name,role} |
| GET /api/id/me | X-Session | — | 200 {ok,loginId,email,name,role,status,group,referrer,...} |
| POST /api/id/password | X-Session | {password} (관리자: +email) | 200 {ok,changed} |
| POST /api/id/meta | X-Session | {group, referrer} | 200 {ok} |
| POST /api/id/logout | X-Session | — | 200 {ok} |
| POST /api/id/signup | 없음 | {id,password,email,group,referrer} | 200 {ok,token,user} |
