# Immich 앱이 실제로 하는 것 tidoly stow 서버가 Immich 앱(주로 **Android 3.3.1**)을 붙이며 알게 된 앱의 동작. 서버를 고칠 때 "앱이 이걸 보나?" 를 여기서 먼저 찾는다. **폰에서 잰 것**과 **앱 소스에서 읽은 것**을 줄마다 구분한다. 아이폰 앱은 아직 재지 않았다. 근거: `trials/2026-10-13-immich-auth` · 이슈 #3 · #5 · #10 · #12 · #17 의 코멘트. --- ## 로그인 - **앱은 서버가 로그인 응답에 심은 쿠키만 돌려보낸다** — `immich_access_token` · `immich_auth_type` · `immich_is_authenticated` 셋. 응답 본문의 `accessToken` 도, `Authorization` 머리도 쓰지 않는다. 쿠키 없이 201 만 주면 다음 요청부터 아무 자격도 없이 와서 401 → 로그인 화면으로 돌아간다. *(폰에서 잼, #3)* - 이 쿠키를 OAuth 콜백(`/oauth/callback`) 응답에 심으면 OAuth 로그인도 끝난다. 그 뒤 `/users/me` · `/auth/validateToken` · `/sync/stream` · `/sync/ack` · `POST /assets` 가 모두 그 쿠키로 왔다. *(폰에서 잼)* - `/server/features` 에 `oauth: true` · `passwordLogin: false` 를 주면 OAuth 단추만 보인다. *(폰에서 잼)* - **구성원을 빼면 접근은 끊기지만 앱은 스스로 로그아웃하지 않는다.** 세션을 지운 뒤 앱은 옛 쿠키로 계속 401 을 받으며 `POST /assets` 를 20초에 240번 다시 보냈고, 메인 화면에 머물렀다. 모바일 3.3.1 은 웹소켓의 `on_session_delete` 를 듣지 않는다(웹만 듣는다). *(폰에서 잼 + 소스에서 읽음, #3)* ### 입장권 검사 (127.0.0.1 에서 잼) | 경우 | 결과 | |---|---| | 같은 입장권 두 번 | 401 `already used` | | 다른 앱의 PKCE verifier | 401 | | 다른 slug 의 입장권 | 401 | | 만료된 입장권 | 401 | | 구성원이 아님 | home 이 403, 입장권 없음 | | slug 의 것이 아닌 돌아갈 주소 | home 이 400 | ## 백업 - **앱은 업로드 응답(201)만으로 "백업됨" 으로 바꾸지 않는다** — 웹소켓으로 `AssetUploadReadyV2` 가 와야 한다. *(폰에서 잼, #5)* - 앱의 변경은 sync stream 으로 받는다. 서버가 지운 것을 앱에서도 지우려면 그 종류의 `…DeleteV1` 을 보내고, ack 받을 종류에 넣어야 한다(추억은 `MemoryDeleteV1`). 앱은 `on_asset_update` 를 받으면 sync 를 다시 한다. - 재시작 뒤에도 로그인 · 백업이 유지된다. *(폰에서 잼, #5)* ## 삭제 - 앱의 삭제는 서버에 **휴지통으로 옮기기**만 청한다. 한 장 보기의 삭제는 폰의 파일을 지우지 않는다 — 서버 쪽만으로 "폰에서만 지우기" 는 만들 수 없다. *(폰에서 잼, #17)* ## 화면에 무엇이 뜨나 - **인물**: 얼굴이 **3개 이상**이거나 **이름이 붙은** 사람만 목록에 나온다. *(소스에서 읽음, #10)* - `/server/features` 를 꺼짐으로 답해도 **인물 · 장소 · 추억 메뉴는 숨지 않는다.** *(폰에서 잼)* - **추억**: 서버가 만든 추억(`MemoriesV2` · `MemoryToAssetsV2`)이 라이브러리 → 추억에 뜬다. *(폰에서 잼, 2026-10-14)* - **앨범 만들기 · 좋아요**가 된다. *(폰에서 잼, #12)* - **장소**의 대표 그림: 앱이 장소를 열 때 서버에 따로 묻지 않았다. 폰에서 올리지 않은 사진이라 안 뜬 것으로 보지만 확인하지 않았다. - **공유 링크**: 서버가 `/api/shared-links` 에 404 를 주면 앱의 공유 링크가 비어 있다(지금 그렇게 둔다). ## TV 캐스트 (Google Cast) - 서버에 있는 사진은 TV 에 뜬다. *(폰에서 잼)* - 앱은 캐스트 전에 `GET /api/assets/{id}` 로 파일 형식을 묻고, 답이 없으면 아무것도 보내지 않는다. 폰에만 있는 사진은 캐스트하지 않는다. *(소스에서 읽음)* ## 서버가 Immich 서버와 다르게 하는 것 - **추억**은 Immich 의 "같은 날" 이 아니라 "같은 달 + 날마다 다른 해", 오늘 것만 앱에 둔다(같은 사진이 여러 번 뜨던 문제, 2026-10-17). ## 아직 안 잰 것 아이폰 앱 · 터널을 지난 폰 앱 · 진짜 tidoly-home 입장권으로 로그인 · 입장권 거절 세 경우를 폰에서 보기.