<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>GDPR on monkshark.dev</title><link>https://monkshark.github.io/tags/gdpr/</link><description>Recent content in GDPR on monkshark.dev</description><generator>Hugo -- gohugo.io</generator><language>ko</language><lastBuildDate>Sat, 02 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://monkshark.github.io/tags/gdpr/index.xml" rel="self" type="application/rss+xml"/><item><title>PIPA·GDPR이 모바일 앱에 요구하는 것 — 개발자 체크리스트</title><link>https://monkshark.github.io/p/pipa-gdpr-mobile-checklist/</link><pubDate>Sat, 02 May 2026 00:00:00 +0000</pubDate><guid>https://monkshark.github.io/p/pipa-gdpr-mobile-checklist/</guid><description>&lt;p&gt;앱 출시 전 또는 정기 점검 시 한 번 훑어볼 만한 체크리스트다. PIPA(개인정보보호법, 한국)와 GDPR(EU)이 공통으로 요구하는 항목 위주로, Flutter + Firebase 환경에서의 실용적 구현도 함께 적었다.&lt;/p&gt;
&lt;p&gt;법률 자문이 아니라 개발자 관점의 정리다. 정확한 적용은 변호사·DPO와 함께 검토해야 한다.&lt;/p&gt;
&lt;h2 id="1-동의-수집--사용-전에-받았는가"&gt;&lt;a href="#1-%eb%8f%99%ec%9d%98-%ec%88%98%ec%a7%91--%ec%82%ac%ec%9a%a9-%ec%a0%84%ec%97%90-%eb%b0%9b%ec%95%98%eb%8a%94%ea%b0%80" class="header-anchor"&gt;&lt;/a&gt;1. 동의 수집 — 사용 전에 받았는가
&lt;/h2&gt;&lt;p&gt;PIPA는 개인정보 수집·이용 시 사전 동의를 요구한다. 필수 항목과 선택 항목을 구분해서 별도 체크박스로 받아야 한다.
GDPR도 동의는 &amp;ldquo;freely given, specific, informed, unambiguous&amp;quot;여야 한다고 적고 있다. 사전 체크된 박스는 동의로 인정되지 않는다.&lt;/p&gt;
&lt;p&gt;구현 포인트:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;회원가입 화면에서 &amp;ldquo;전체 동의&amp;rdquo; 단일 체크박스만 두지 않는다. 필수 항목과 선택 항목(마케팅 등)을 분리한다.&lt;/li&gt;
&lt;li&gt;동의 일자, 동의 버전, 동의한 항목을 서버에 기록한다. 추후 &amp;ldquo;그때 무엇에 동의했는가&amp;quot;의 입증이 필요하다.&lt;/li&gt;
&lt;li&gt;Firestore 예시:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;users/{uid}/consents/{consentId}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - version: &amp;#34;2026.04&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - acceptedAt: 2026-05-01T09:00Z
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - items: [&amp;#34;privacy_required&amp;#34;, &amp;#34;marketing&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="2-보관-기간--무한-저장-금지"&gt;&lt;a href="#2-%eb%b3%b4%ea%b4%80-%ea%b8%b0%ea%b0%84--%eb%ac%b4%ed%95%9c-%ec%a0%80%ec%9e%a5-%ea%b8%88%ec%a7%80" class="header-anchor"&gt;&lt;/a&gt;2. 보관 기간 — 무한 저장 금지
&lt;/h2&gt;&lt;p&gt;PIPA는 수집 목적 달성 후 지체 없이 파기를 요구한다. 법령상 보존 기간이 있는 경우(전자상거래 5년 등)만 예외다.
GDPR의 storage limitation 원칙도 같은 취지다 — 목적에 필요한 기간만 보관.&lt;/p&gt;
&lt;p&gt;구현 포인트:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Firestore TTL 정책 활용: 컬렉션별로 &lt;code&gt;expiresAt&lt;/code&gt; 같은 필드를 두고 콘솔에서 TTL을 활성화하면 자동 삭제된다.&lt;/li&gt;
&lt;li&gt;Firebase Auth 자체에는 TTL이 없으므로 inactive 사용자 정리는 Cloud Functions의 스케줄러로 별도 구현한다.&lt;/li&gt;
&lt;li&gt;로그·접속 기록은 90일 이상 보관 시 별도 동의 또는 법적 근거를 명시한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="3-삭제-요청--30일-안에-처리되는가"&gt;&lt;a href="#3-%ec%82%ad%ec%a0%9c-%ec%9a%94%ec%b2%ad--30%ec%9d%bc-%ec%95%88%ec%97%90-%ec%b2%98%eb%a6%ac%eb%90%98%eb%8a%94%ea%b0%80" class="header-anchor"&gt;&lt;/a&gt;3. 삭제 요청 — 30일 안에 처리되는가
&lt;/h2&gt;&lt;p&gt;PIPA는 정보주체의 삭제·열람·정정 요청을 받으면 10일 이내 처리를 요구한다.
GDPR의 Right to erasure(잊혀질 권리)는 부당 지연 없이, 늦어도 1개월 이내 처리해야 한다.&lt;/p&gt;
&lt;p&gt;구현 포인트:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;앱 안에 &amp;ldquo;회원 탈퇴&amp;rdquo; 메뉴가 필수다. 메일 문의로만 받는 구조는 부적합하다.&lt;/li&gt;
&lt;li&gt;탈퇴 버튼이 실제로 무엇을 지우는지 정의해야 한다 — 사용자 프로필, 게시물, 댓글, 채팅, 푸시 토큰까지.&lt;/li&gt;
&lt;li&gt;백업이나 logs 컬렉션에 남는 식별자도 익명화 처리한다.&lt;/li&gt;
&lt;li&gt;Firebase Auth의 &lt;code&gt;deleteUser()&lt;/code&gt; 호출 후 Firestore의 사용자 데이터는 Cloud Functions의 &lt;code&gt;onDelete&lt;/code&gt; 트리거로 cascading 삭제하는 패턴이 안정적이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="4-미성년자--별도-동의가-필요한가"&gt;&lt;a href="#4-%eb%af%b8%ec%84%b1%eb%85%84%ec%9e%90--%eb%b3%84%eb%8f%84-%eb%8f%99%ec%9d%98%ea%b0%80-%ed%95%84%ec%9a%94%ed%95%9c%ea%b0%80" class="header-anchor"&gt;&lt;/a&gt;4. 미성년자 — 별도 동의가 필요한가
&lt;/h2&gt;&lt;p&gt;PIPA: 만 14세 미만은 법정대리인 동의가 필수.
GDPR: 만 16세 미만(국가별로 13~16세). 부모 동의 필수.&lt;/p&gt;
&lt;p&gt;구현 포인트:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;가입 시 생년월일을 받아 미성년자 여부를 자동 판별한다.&lt;/li&gt;
&lt;li&gt;미성년자 분기에서는 보호자 이메일/연락처를 추가로 입력받고, 보호자에게 인증 메일을 발송한다 → 보호자가 클릭해야 가입 완료.&lt;/li&gt;
&lt;li&gt;사용자 전원이 미성년자인 도메인(예: 학교 앱)이라면 가입 시 학교 인증을 동의 절차에 통합하는 식의 변형이 필요하다. 일반 앱은 &amp;ldquo;미성년 비율이 작아도 분기는 무조건 만들어둘 것&amp;quot;이 안전하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="5-제3자-제공--어디로-흘러나가는가"&gt;&lt;a href="#5-%ec%a0%9c3%ec%9e%90-%ec%a0%9c%ea%b3%b5--%ec%96%b4%eb%94%94%eb%a1%9c-%ed%9d%98%eb%9f%ac%eb%82%98%ea%b0%80%eb%8a%94%ea%b0%80" class="header-anchor"&gt;&lt;/a&gt;5. 제3자 제공 — 어디로 흘러나가는가
&lt;/h2&gt;&lt;p&gt;PIPA는 제3자 제공 시 별도 동의를 요구한다. 누구에게, 무슨 항목을, 무슨 목적으로 제공하는지 명시해야 한다.
GDPR은 third-party processor와 DPA(Data Processing Agreement) 체결을 요구한다.&lt;/p&gt;
&lt;p&gt;구현 포인트:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Firebase Analytics, Crashlytics, AdMob, 푸시 SDK 등은 모두 제3자 처리자에 해당한다.&lt;/li&gt;
&lt;li&gt;처리방침에 사용 중인 SDK 전체 목록과 각각의 데이터 흐름을 명시한다.&lt;/li&gt;
&lt;li&gt;AdMob 사용 시 IDFA/AAID 수집 여부에 대한 별도 동의가 필요하다 (iOS는 ATT 프롬프트 + 앱 내 동의).&lt;/li&gt;
&lt;li&gt;EU 사용자가 있다면 Google Analytics 4의 EU 데이터 보호 옵션을 활성화한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="6-처리방침--접근-가능한-위치에-있는가"&gt;&lt;a href="#6-%ec%b2%98%eb%a6%ac%eb%b0%a9%ec%b9%a8--%ec%a0%91%ea%b7%bc-%ea%b0%80%eb%8a%a5%ed%95%9c-%ec%9c%84%ec%b9%98%ec%97%90-%ec%9e%88%eb%8a%94%ea%b0%80" class="header-anchor"&gt;&lt;/a&gt;6. 처리방침 — 접근 가능한 위치에 있는가
&lt;/h2&gt;&lt;p&gt;PIPA는 처리방침을 &amp;ldquo;이용자가 쉽게 확인할 수 있도록&amp;rdquo; 게시할 것을 요구한다. 앱 내 1~2 탭으로 접근 가능해야 한다.
GDPR의 transparency 원칙 역시 데이터 수집 시점에 privacy notice 제공을 요구한다.&lt;/p&gt;
&lt;p&gt;구현 포인트:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;회원가입 화면에 &amp;ldquo;처리방침 보기&amp;rdquo; 링크 + 탭 시 풀스크린으로 표시한다.&lt;/li&gt;
&lt;li&gt;설정 메뉴에 &amp;ldquo;개인정보 처리방침&amp;quot;과 &amp;ldquo;이용약관&amp;rdquo; 두 개 모두 노출한다.&lt;/li&gt;
&lt;li&gt;외부 URL이 아닌 앱 내부에서 렌더하는 편이 안정적이다 — 네트워크가 끊겨도 보여야 하기 때문이다. Markdown을 번들링하는 방식을 권장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="7-책임자-표기--누구에게-문의해야-하는가"&gt;&lt;a href="#7-%ec%b1%85%ec%9e%84%ec%9e%90-%ed%91%9c%ea%b8%b0--%eb%88%84%ea%b5%ac%ec%97%90%ea%b2%8c-%eb%ac%b8%ec%9d%98%ed%95%b4%ec%95%bc-%ed%95%98%eb%8a%94%ea%b0%80" class="header-anchor"&gt;&lt;/a&gt;7. 책임자 표기 — 누구에게 문의해야 하는가
&lt;/h2&gt;&lt;p&gt;PIPA는 개인정보 보호책임자(CPO)의 이름·소속·연락처를 명시하도록 한다.
GDPR은 DPO 임명이 의무인 경우(공공기관, 대규모 모니터링 등)에 한해 연락처 공개를 요구한다.&lt;/p&gt;
&lt;p&gt;구현 포인트:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;처리방침 마지막에 다음 형식으로 표기한다:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;개인정보 보호책임자
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- 성명: 홍길동
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- 소속: 한솔개발팀
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- 이메일: privacy@example.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- 전화: 02-XXX-XXXX
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;1인 개발자라면 본인이 책임자다. 이메일은 개인 주소보다 별도 도메인(&lt;code&gt;privacy@yourdomain.com&lt;/code&gt;)이 낫다 — 회원가입용 메일과 분리되어야 식별이 쉽다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="마무리"&gt;&lt;a href="#%eb%a7%88%eb%ac%b4%eb%a6%ac" class="header-anchor"&gt;&lt;/a&gt;마무리
&lt;/h2&gt;&lt;p&gt;체크리스트 형식으로 적었지만 각 항목의 구현은 단순하지 않다. 특히 4번(미성년자)과 5번(제3자 제공)은 모바일 앱에서 잘 빠지는 영역이라 출시 전 별도 점검이 필요하다.&lt;/p&gt;
&lt;p&gt;이 글은 PIPA·GDPR 모두를 만족시키려는 사람의 기준이다. 한쪽 시장에만 출시할 거라면 해당 법령만 정확히 따르는 편이 작업량이 줄어든다.&lt;/p&gt;</description></item></channel></rss>