hanip.me

개인정보 처리방침

한입(hanip.me)이 실제로 다루는 데이터를 있는 그대로 적어뒀어요.

시행일자 2026년 9월 11일

한입은 회원가입도 로그인도 없어요. 아래는 이 서비스가 실제로 저장하고 보내는 데이터 전부예요.

이 기기에만 저장하는 것

카드로 만난 한입과 선택·실행 기록, 직접 고른 음식 갈래와 그 결과, 끼니 진행·재오픈 상태, 마지막 카드 섞기 방식, 이미 본 카피 한마디, 설치 배너를 닫았는지, 무작위 설치 식별자, 사용자가 직접 답한 지난 한입의 실제 섭취 여부와 음식 단위 추천 제외, 도감에서 직접 담아 둔 한입 목록을 브라우저 저장소(localStorage)에 둬요. 홈 화면 고양이의 반응을 정하려고 방문 횟수, 마지막 방문 시각, 마지막 반응 맥락과 그림 변형 번호도 저장해요. 이 네 값의 원본 레코드와 정확한 방문 횟수·마지막 방문 시각은 제품 사용 통계나 별도 API payload로 보내지 않아요. 다만 선택된 고양이 이미지를 불러오는 정적 파일 요청 경로에는 반응 맥락·그림 변형 번호·등불 단계가 들어 있어 호스팅/CDN 계층에서 요청 정보로 보일 수 있어요. 같은 이유로, 칭호 공유 링크(/t/{칭호 id})에는 사용자가 보내기로 고른 칭호 id와 함께 보낼 때만 메뉴 id가 들어 있고 그 밖에는 아무것도 담지 않아요. 방문 반응 값은 데이터 관리에서 지울 수 있지만 백업 내보내기·가져오기에는 포함하지 않아요. 점진 추천 기능을 켜기 전에도 가져온 백업을 안전하게 다룰 수 있도록, 추천 진행에는 공개·선택·실행한 음식 ID, 활동일과 집계, 최근 공개 목록과 최근 명시적 거절 목록, 취향 가중치·제외 태그, 낯선 음식 허용도, 정책·Core 버전, 그리고 같은 실행을 두 번 세지 않기 위한 무작위 실행 영수증을 두 묶음으로 제한해 저장할 수 있어요(중단 복구용 최대 256개, 최대 1,000건인 이 기기 이벤트 기록과 맞추는 용도 최대 1,000개). ‘셋 다 아니에요’의 세 신호와 세 음식 기록이 모두 저장된 경우에만, 그 음식 ID 세 개·끼니 구분·날짜와 한 번 반영했는지를 별도 보정 기록으로 저장해요. 이 한 번을 여러 탭이나 중단 뒤에도 중복 적용하지 않도록 무작위 영수증·임시 claim 식별자와 최대 2분의 만료 시각을 함께 저장하고, 실제로 보정된 세 장의 세션에는 같은 식별자를 완료 증거로 남겨요. 다음 같은 끼니에서 한 번 우선 피하고 최대 14일 동안 점차 약해지는 순서 보정에만 쓰며, 그중 하나를 고르거나 지도·배달에서 찾으면 그 음식은 즉시 보정에서 빼요. 선택·실행 이벤트에는 행동을 시작할 때 보던 보정 영수증 세대만 로컬로 함께 남겨, 늦게 끝난 예전 행동이 새 보정을 해제하지 못하게 해요. 지도·배달로 화면을 떠나기 직전에는 실행 음식 ID·무작위 의도 ID·생성 시각, 같은 데이터 세대 값과 당시 보정 영수증 세대(있을 때)를 그 탭의 sessionStorage에 두고 최대 30분 동안만 복구 대상으로 인정해요. 저장에 성공하면 즉시 지우고, 만료되거나 손상된 값은 hanip.me로 돌아와 확인할 때 지우며, 탭을 닫아도 사라져요. 이 임시 기록은 백업 내보내기·가져오기에는 포함하지 않고 데이터 관리나 브라우저 사이트 데이터 삭제로 지울 수 있어요. 이 기기에 저장된 선택 이력은 요청 시점에만 검수된 맛 분류에 약하게 연결해 이후 추천 순서를 조정하고, 이미 추천 제외한 음식은 이 계산에서도 빼요. 같은 음식의 지도·배달 실행은 선택 신호를 보강할 수 있지만 실행만으로 새로운 맛 취향을 만들거나 실제 섭취·만족을 추정하지 않고, 한 끼 도전 선택도 저장하지 않아요.

음식과 연결된 정확한 답변·추천 제외 목록은 이 브라우저에만 남아 추천 조정과 기록·도감·프로필 표시에 쓰여요. 기능이 실제로 도움이 되는지 보려고 질문 노출·먹음·못 먹음·제외·복원처럼 음식과 연결되지 않은 넓은 이벤트 종류만 서버에 보내요. 음식 ID·이름·끼니·답변 원문·추천 제외 목록·부정 이유·제외 태그·취향 가중치는 통계에 넣지 않아요. 설치 식별자 원문도 서버로 보내지 않지만, 가명 방문 통계를 구분하려고 그 원문을 SHA-256으로 해시한 뒤 앞 16바이트(32자리 16진수)만 가명 설치 digest로 서버에 보내요.

기록을 지우거나 가져오는 동안 이전 화면의 늦은 저장이 다시 나타나지 않도록, 내용·사용자·시간을 담지 않는 내부 변경 세대 숫자 하나를 따로 둬요. 이 숫자는 내보내지 않으며 기록을 지우거나 가져올 때 새 값으로 바뀌어요. 브라우저의 사이트 데이터를 지우면 함께 사라져요. 여러 탭의 저장을 조정하는 Web Locks를 지원하지 않는 구형 브라우저에서는 한 탭의 기본 기록은 남지만, 여러 탭이 동시에 쓰면 일부 갱신이 빠질 수 있어요. 그런 환경에서 기록 지우기·가져오기는 일부만 바꾸지 않고 오류로 끝나요.

'서비스 정보'의 '데이터 관리'에서는 선택·추천 기록과 저장 위치를 내보내거나 가져올 수 있고, 방문 반응 값을 포함한 이 기기의 기록과 저장 위치를 모두 지울 수 있어요. 브라우저에서 사이트 데이터를 지워도 똑같이 없어져요.

제품 사용 통계로 수집하는 건 가명 방문 통계예요

제품을 개선하려고 방문(visit)·시작(start)·공개(reveal)·결정(decide)·공유(share)·실행(execute)·공유 결과 착지 조회(result_view), 추천 이유 노출(recommendation_reason_impression)·펼침(recommendation_reason_expand)·접기(recommendation_reason_collapse), 지난 한입 질문 노출(feedback_prompt)·먹음 응답(feedback_tasted)·못 먹음 응답(feedback_not_eaten)·추천 제외(feedback_exclude)·제외 취소(feedback_exclude_undo), 도감 화면 열람(dex_view — 도감 화면을 열었는지만 방문당 한 번) 열여섯 종류의 이벤트만 모아요. 브라우저가 보내는 값은 설치 식별자 원문을 SHA-256으로 해시한 뒤 앞 16바이트만 쓴 가명 설치 digest, 방문마다 무작위로 만든 방문 식별자, 이벤트 종류, 정확한 시각을 담지 않는 0부터 14까지의 방문 내 발생 순번, 유입원 구분 열 가지(cat·threads·food-guide·intent-landing·direct·other·theme·room·search·pwa), 방문을 시작할 때 화면에 표시되던 언어 한 가지(ko·en·ja 중 하나), 결정 이벤트에만 붙는 소요 시간 구간, 앱 버전, 그리고 검토된 실험이 켜졌을 때 방문 단위로 정한 닫힌 코드값 experiment_id와 variant예요. 지금 기준선에서는 두 실험 값은 저장하지 않아요. 유입원 열 가지의 뜻은 이래요 — cat은 한닙캣 게시물 링크로, threads는 스레드 링크로, food-guide는 음식 안내서의 카드 CTA로, intent-landing은 상황별 추천 CTA로, theme은 테마 페이지에서 카드로, room은 친구 도움방 링크로, search는 검색 엔진에서(referrer의 호스트만 판독하고 주소 자체는 저장하지 않아요), pwa는 홈 화면에 추가한 앱으로 열었는지, direct는 그 밖의 직접 방문, other는 알아보지 못한 표식이에요. search와 pwa를 가리려고 브라우저 안에서만 document.referrer의 호스트와 화면 표시 모드(standalone)를 읽고, 그 값으로 유입원 하나를 정한 뒤에는 referrer 주소도 표시 모드 값도 서버로 보내지 않고 저장하지도 않아요. 서버는 요청을 받은 시점의 KST 달력 날짜를 저장하고 요청 주소로 측정 환경(production 또는 qa)을 판정하며, 앱 버전과 발생 순번은 현재 서버 빌드와 정확히 일치하는 요청에서만 함께 보존하고 구버전·미확인 버전의 순번은 저장하지 않아요. 실험 값도 등록된 짝만 정규화해 저장해요. 화면 언어도 알아보지 못한 값이거나 언어를 함께 보내지 않은 요청(구버전 브라우저 등)이면 어느 언어로도 추정하지 않고 비워 둬요. production 요청에는 오너 검수와 통제 synthetic 요청을 공식 외부 기준선에서 빼기 위해 서버가 요청 쿠키에서 external·owner_test·synthetic 중 하나의 낮은 카디널리티 구분값을 붙여요. 쿠키는 권한이나 사람 여부를 증명하지 않는 최선 노력 제외 표식이며, 쿠키 원문은 지표 테이블에 저장하지 않아요. 또 한국에서 열어 본 방문인지 아닌지를 나라 단위로만 보려고, 요청에 이미 실려 오는 국가 정보를 서버가 '한국(KR)'과 '그 밖(other)' 두 값 중 하나로 접어서만 저장해요. 도시·지역·좌표나 접기 전의 국가 코드는 저장하지 않고, 나라를 알 수 없는 요청은 '그 밖'으로 추정하지 않고 비워 둬요. 이 값은 브라우저 위치 권한이나 '주변 식당 찾기'에서 따로 허용한 저장 위치와는 아무 관계가 없어요. 구버전 브라우저가 보내는 기기 날짜는 무시해요. 이벤트는 한 방문에서 종류별 한 번만 세요. 검증과 레이트리밋을 통과해 D1에 도달한 정확히 같은 이벤트 요청은 로우 하나를 유지하고, 그 경계에서 관측한 시도 횟수의 하한만 1부터 2까지 남겨요. 이는 모든 서버 도착이나 자동 재시도만을 세는 값이 아니에요. 음식 안내서와 상황별 추천 문서를 읽는 동안에는 이벤트를 만들지 않아요. 안내서 CTA를 따라 홈에 들어온 방문은 food-guide, 상황별 추천 CTA를 따라 들어온 방문은 intent-landing으로만 구분해요. 이 공개 표식들은 최선 노력 통계일 뿐 인증된 유입 증명으로 쓰지 않아요.

정확한 안내서·상황별 추천 URL이나 개별 페이지 식별자는 보내지 않아요. 사용자가 누른 고정 진입 링크는 discover·decide·collect(알아보기·메뉴 결정·수집) 세 값 중 하나로만 구분해 유입원과 별도로 보내요. 이 값은 방문 시작 때 한 번 정해 언어 전환과 재시도 중에도 유지해요. 표식이 없거나 알아보지 못하면 추정하지 않고 비워 둬요. 이 분류로는 공개 랜딩 노출·이탈, 주문 카드 저장, 실제 주문·식사를 측정하지 않아요. 현재 검수·공개한 상황별 추천은 매운 음식과 K-트렌드 두 종류라, intent-landing만으로는 어느 문서의 CTA였는지 구분할 수 없어요. 앱 버전·측정 환경·실험 코드도 메뉴나 문구 원문이 아니라 배포와 비교 조건을 구분하는 낮은 카디널리티 표식이에요. 그 밖에 어떤 메뉴인지, 음식 ID·이름, 검색어, 끼니, 답변 원문, 추천 제외 목록, 카드 위치, 도시·지역·좌표 같은 개별 위치, 추천 근거의 내용, 정확한 시각, 이름·이메일은 통계에 넣지 않아요. 추천 이유를 펼친 행동은 취향 학습에도 쓰지 않아요. 통계는 서버가 붙인 KST 달력 날짜 기준 30일간 보관하고, 매일 그보다 오래된 행을 자동으로 삭제해요.

날씨는 이렇게만 써요

카드 화면 배경 분위기(맑음·흐림·비·눈)와 검수된 따뜻한 국물·가벼운 음식·비 오는 날 적합 분류를 오늘 날씨에 조금 맞추려고, 요청에 실려 오는 대략적인 도시 단위 위치를 그 순간 날씨를 확인하는 데만 잠깐 이용해요.

정밀한 GPS 좌표는 쓰지 않고, 위도·경도 값 자체를 한입의 응답·저장소·운영 로그에 남기지 않아요. 날씨 조회를 위해 외부 공급자 Open-Meteo에 대략 좌표를 보내고, 한입에서는 같은 지역의 날씨 결과만 15분 정도 짧게 재사용해요.

날씨는 이미 검수·적격인 음식 안에서만 0.90~1.15 배 범위로 순서에 영향을 줄 수 있어요. 추천 제외, 알레르기, 끼니, 도전 음식 조건을 풀지 않고, 도시·기온·날씨 종류를 추천 기록이나 통계에 남기지 않아요. 날씨가 실제 순위에 기여한 경우에는 그 사실과 숫자형 기여도만 이 기기의 추천 세션에 남을 수 있어요. 복날·발렌타인데이·블랙데이 안내는 KST 날짜와 공개 자료로만 보여 주며 추천 점수와 취향 기록을 바꾸지 않아요.

오프라인 캐시와 홈 화면 설치

한입은 PWA라 화면·이미지 같은 정적 자원을 기기에 캐시해 다음 방문을 더 빠르게 열어요. 캐시는 이 기기 안에만 있고, 방문 기록 같은 API 응답은 캐시하지 않아요.

홈 화면에 설치해도 새로운 데이터가 생기지 않아요 — 브라우저를 더 빠르게 여는 바로가기일 뿐이에요.

친구 도움방(투표) 데이터

친구에게 메뉴 후보 세 장을 보여주고 골라달라고 하는 '도움방' 기능은 방을 운영하려고 방을 만들 때 고른 카드 3장의 id, 친구들이 고른 가명 투표, 투표에 붙인 이유 태그를 별도의 도움방 서버에 잠깐 저장하고, 방 생성 요청에 메인 앱의 숫자형 앱 버전도 함께 보내요. 이름·카카오 계정·전화번호·정확한 위치는 묻지 않고, 투표자를 구분하는 값과 방장 권한 값도 원문이 아니라 단방향 해시로 저장해요. 같은 방의 ‘내 카드 세 장 보기’ 이동을 중복 집계하지 않으려고, 이 탭의 sessionStorage에는 원본 roomId가 아닌 16자리 방 범위값과 대기·표시 상태를 최대 16개까지 탭 종료 시점까지만 저장해요. 데이터 관리에서 기록을 지워도 함께 삭제돼요.

이 방 운영 데이터는 만든 지 최대 15분 뒤 원래 설정된 alarm에서 자동으로 완전히 삭제돼요. 방장이 그 전에 메뉴를 확정해도 투표와 이유 태그는 즉시 지워지지 않고 그 alarm 시점까지 남을 수 있어요.

그 뒤에도 가명 처리된 방 단위 통계·운영 기록은 남아요. 이 기록에는 공개 공유 링크의 roomId를 별도 비밀키 없이 SHA-256한 room_hash, KST 달력 날짜, 끼니 구간, 후보·확정 메뉴 id, 방 생성·첫 투표·확정·만료와 방장·친구 화면의 열한 가지 행동 이벤트, 각 시점의 메뉴별 득표수와 참여자 수, 확정 순위·동률·걸린 시간 구간, 서버가 요청 출처로 구분한 측정 환경(production 또는 qa), 클라이언트가 보낸 형식 검증 숫자형 앱 버전이 들어갈 수 있어요. 같은 room_hash의 연속 득표 현황 차이로 어느 카드에 표가 추가되거나 바뀌었는지 추론될 수 있지만, 투표자를 구분하는 값과 개별 이유 태그는 이 장기 기록에 넣지 않아요. 공개된 요청 출처와 앱 버전 표식은 비교용 최선 노력 통계이며 인증된 출처·버전 증명은 아니에요. 이 가명 기록에는 현재 자동 삭제 기한이 정해져 있지 않아요.

하지 않는 것과 호스팅 보안

로그인도 회원가입도 없어요. 위치는 '주변 식당 찾기'를 직접 누를 때마다 브라우저가 최신 현재 위치를 확인하고, 이미 정한 위치 권한이 있으면 그 결정을 적용해요. 허용한 좌표는 소수 셋째 자리(약 100m)로 낮추고, 거친 정확도 구간·마지막 저장일과 함께 통계에 쓰는 것과 같은 가명 설치 digest에 연결해 저장해요. 근처 식당 검색과 저장 위치 관리에만 쓰며, 마지막 저장일로부터 KST 달력 날짜 기준 180일이 지나면 매일 자동 삭제해요. '서비스 정보'의 '데이터 관리'에서도 언제든 직접 삭제할 수 있어요. 광고나 추적 스크립트를 심지 않고, 데이터를 팔거나 광고 목적으로 넘기지 않아요.

호스팅과 악성 트래픽 차단에는 Cloudflare 보안 계층을 사용해요. 이 과정에서 Cloudflare가 봇 판별용 __cf_bm 쿠키를 설정하고 요청 IP·브라우저 정보를 보안 목적으로 처리할 수 있어요. 한입은 이 쿠키를 광고나 메뉴 개인화에 사용하지 않아요.

'주변 식당 찾기'는 메뉴명과 방금 확인한 약식 좌표를 네이버 지도(map.naver.com) 검색 주소에 넣어 이동해요. '위치 없이 메뉴명만 지도에서 검색'을 고르면 현재 위치를 확인하거나 저장하지 않고 좌표 없이 메뉴명만 보내요. '배달 앱에서 찾기'는 메뉴명을 기기에 복사한 뒤 설치된 배달의민족 또는 쿠팡이츠 앱을 열어요. 이동한 뒤에는 각 서비스의 개인정보 처리방침과 이용약관이 적용돼요.

이 서비스에 대해

개인이 만들어 운영하는 서비스예요. 선택·추천 기록과 저장 위치는 '서비스 정보'의 '데이터 관리'에서 내보낼 수 있고, 방문 반응 값을 포함한 이 기기 기록과 저장 위치는 모두 지울 수 있어요. 오류나 접근성 문제는 아래 이메일로 알려주세요.

이메일로 문의하기

보내주신 이메일은 문의 답변에만 사용해요.