diff --git a/src/main/java/com/swyp/picke/domain/oauth/jwt/JwtFilter.java b/src/main/java/com/swyp/picke/domain/oauth/jwt/JwtFilter.java index cfc6abd..42c11fc 100644 --- a/src/main/java/com/swyp/picke/domain/oauth/jwt/JwtFilter.java +++ b/src/main/java/com/swyp/picke/domain/oauth/jwt/JwtFilter.java @@ -48,6 +48,8 @@ public class JwtFilter extends OncePerRequestFilter { "/.well-known", "/api/v1/resources", "/app-ads.txt", + "/terms", + "/privacy-policy", "/robots.txt" ); diff --git a/src/main/java/com/swyp/picke/global/config/SecurityConfig.java b/src/main/java/com/swyp/picke/global/config/SecurityConfig.java index 9f36b37..183146f 100644 --- a/src/main/java/com/swyp/picke/global/config/SecurityConfig.java +++ b/src/main/java/com/swyp/picke/global/config/SecurityConfig.java @@ -51,7 +51,9 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { "/battle/**", "/.well-known/**", "/app-ads.txt", - "/robots.txt" + "/robots.txt", + "/terms", + "/privacy-policy" ).permitAll() // 2. 관리자 HTML 화면 렌더링 요청 diff --git a/src/main/java/com/swyp/picke/global/web/controller/StaticTextFileController.java b/src/main/java/com/swyp/picke/global/web/controller/StaticTextFileController.java index 1169e83..2b2a692 100644 --- a/src/main/java/com/swyp/picke/global/web/controller/StaticTextFileController.java +++ b/src/main/java/com/swyp/picke/global/web/controller/StaticTextFileController.java @@ -14,8 +14,10 @@ /** * app-ads.txt, robots.txt는 크롤러(AdMob, 검색엔진)가 Content-Type: text/plain을 기대하므로, * 정적 리소스 핸들러의 MIME 추론에 맡기지 않고 명시적으로 text/plain으로 응답한다. + * 이용약관/개인정보처리방침은 노션 공유 링크가 로그인 리다이렉트 루프에 걸려 외부(AdMob 심사 등)에서 + * 접근 불가능해서, 인증 없이 접근 가능한 정적 HTML로 직접 서빙한다. */ -@Tag(name = "정적 텍스트 파일", description = "app-ads.txt, robots.txt 서빙") +@Tag(name = "정적 텍스트 파일", description = "app-ads.txt, robots.txt, 약관/정책 페이지 서빙") @RestController public class StaticTextFileController { @@ -33,6 +35,18 @@ public ResponseEntity getRobotsTxt() throws IOException { return textResponse("static/robots.txt"); } + @Operation(summary = "서비스 이용약관 조회") + @GetMapping("/terms") + public ResponseEntity getTerms() throws IOException { + return htmlResponse("static/terms.html"); + } + + @Operation(summary = "개인정보 처리방침 조회") + @GetMapping("/privacy-policy") + public ResponseEntity getPrivacyPolicy() throws IOException { + return htmlResponse("static/privacy-policy.html"); + } + private ResponseEntity textResponse(String classpathLocation) throws IOException { Resource resource = new ClassPathResource(classpathLocation); return ResponseEntity.ok() @@ -41,4 +55,13 @@ private ResponseEntity textResponse(String classpathLocation) throws I .header(HttpHeaders.CACHE_CONTROL, "public, max-age=3600") .body(resource); } + + private ResponseEntity htmlResponse(String classpathLocation) throws IOException { + Resource resource = new ClassPathResource(classpathLocation); + return ResponseEntity.ok() + .contentType(MediaType.TEXT_HTML) + .contentLength(resource.contentLength()) + .header(HttpHeaders.CACHE_CONTROL, "public, max-age=3600") + .body(resource); + } } diff --git a/src/main/resources/static/privacy-policy.html b/src/main/resources/static/privacy-policy.html new file mode 100644 index 0000000..393228a --- /dev/null +++ b/src/main/resources/static/privacy-policy.html @@ -0,0 +1,77 @@ + + + + + +PicKé 개인정보 처리방침 + + + + +

PicKé 개인정보 처리방침

+ +

제1조 (개인정보의 처리 목적)

+

회사는 다음의 목적을 위해 개인정보를 처리하며, 목적 외 용도로는 이용하지 않습니다.

+
    +
  1. 서비스 제공: 이용자의 투표 및 선택 데이터 기반 가치관 성향 분석 리포트 생성, 콘텐츠 추천.
  2. +
  3. 회원 관리: 회원제 서비스 이용에 따른 본인 식별, 부정 이용 방지, 각종 고지 전달.
  4. +
  5. 서비스 개선: 접속 빈도 파악 및 서비스 이용 통계 분석을 통한 서비스 고도화.
  6. +
+ +

제2조 (처리하는 개인정보 항목)

+

회사는 서비스 제공을 위해 아래의 항목을 수집합니다.

+
    +
  1. 회원 가입 및 소셜 로그인: 이메일, 닉네임, 프로필 이미지.
  2. +
  3. 서비스 이용 과정 중 자동 수집: +
      +
    • 서비스 내 콘텐츠 클릭 및 선택 기록(배틀 참여, 투표 등)
    • +
    • 의사결정 고민 시간(Latency) 및 콘텐츠 재생 구간 체류 기록
    • +
    • 기기정보(OS, 모델명), 접속 로그, IP 주소, 쿠키.
    • +
    • 광고 식별자(ADID/IDFA): 맞춤형 광고 제공 및 광고 효과 분석 목적.
    • +
    +
  4. +
+ +

제3조 (개인정보의 처리 및 보유 기간)

+
    +
  1. 회원 정보: 회원 탈퇴 시까지 보유.
  2. +
  3. 서비스 이용 기록: 서비스 이용 종료 시까지 또는 관련 법령(통신비밀보호법 등)에 따른 보존 기간(3개월) 동안 보관.
  4. +
+ +

제4조 (개인정보처리의 위탁)

+

회사는 서비스 분석 및 인프라 운영을 위해 다음과 같이 개인정보 처리 업무를 위탁하고 있습니다.

+
    +
  1. 서버 운영: Google Cloud Platform (데이터 저장 및 관리)
  2. +
  3. 사용자 행동 분석: Mixpanel, Inc. (서비스 이용 통계 및 행동 데이터 분석)
  4. +
  5. 광고 플랫폼: Google AdMob (맞춤형 광고 노출 제어)
  6. +
+ +

제5조 (정보주체의 권리·의무 및 행사방법)

+

이용자는 언제든지 자신의 개인정보 열람, 정정, 삭제, 처리 정지를 요구할 수 있습니다. 서비스 내 설정 메뉴를 통해 직접 처리하거나 고객센터를 통해 요청하실 수 있습니다.

+ +

제6조 (개인정보 자동 수집 장치의 설치·운영 및 거부)

+
    +
  1. 회사는 이용자에게 최적화된 서비스를 제공하기 위해 '쿠키(Cookie)' 및 '광고 식별자'를 사용합니다.
  2. +
  3. 이용자는 브라우저 설정 또는 모바일 기기 설정을 통해 쿠키 허용 거부 및 광고 추적 제한을 설정할 수 있습니다. 단, 거부 시 일부 맞춤형 서비스 이용이 어려울 수 있습니다.
  4. +
+ +

제7조 (개인정보의 안전성 확보조치)

+

회사는 개인정보 보호를 위해 접근 권한 관리, 데이터 암호화, 보안 프로그램 설치 등 기술적/관리적 조치를 다하고 있습니다.

+ +

제8조 (개인정보 보호책임자)

+
    +
  • 성명: 천다올 (대표자)
  • +
  • 담당부서: 서비스 운영팀
  • +
  • 연락처: picke.project@gmail.com
  • +
+ +

부칙
본 개인정보 처리방침은 2026년 4월 5일부터 시행됩니다.

+ + + diff --git a/src/main/resources/static/terms.html b/src/main/resources/static/terms.html new file mode 100644 index 0000000..494bcda --- /dev/null +++ b/src/main/resources/static/terms.html @@ -0,0 +1,74 @@ + + + + + +PICKé 서비스 이용약관 + + + + +

PICKé 서비스 이용약관

+ +

제1조 (목적)

+

본 약관은 PICKé(이하 "회사")가 제공하는 지식 콘텐츠 큐레이션 및 가치관 분석 서비스(이하 "서비스")의 이용과 관련하여 회사와 이용자 간의 권리, 의무 및 책임사항, 서비스 이용조건 및 절차 등을 규정함을 목적으로 합니다.

+ +

제2조 (정의)

+
    +
  1. "서비스"란 회사가 운영하는 애플리케이션 및 웹을 통해 제공되는 지식 콘텐츠 시청, 투표 참여, 가치관 분석 리포트 등을 의미합니다.
  2. +
  3. "콘텐츠"란 회사가 생성한 텍스트, 오디오(TTS 포함), 이미지, 인터랙티브 분기형 대본 등을 말합니다.
  4. +
  5. "내공(포인트)"이란 서비스 내 활동에 따라 부여되는 무상의 가상 데이터로, 등급 상승 및 특정 기능 이용에 사용됩니다. 이는 현금으로 환급되지 않으며 제3자에게 유료로 양도할 수 없습니다.
  6. +
+ +

제3조 (서비스의 특징 및 기술적 제한)

+
    +
  1. 회사는 AI 및 TTS(Text-to-Speech) 기술을 활용하여 콘텐츠를 제공하며, 기술적 특성상 일시적인 음성-텍스트 싱크 불일치나 기계적 오류가 발생할 수 있습니다.
  2. +
  3. 회사가 제공하는 성향 분석 결과는 이용자의 유희와 자아 성찰을 돕기 위한 참고 자료일 뿐, 의학적·법률적·윤리적 판단의 절대적 기준이 될 수 없습니다.
  4. +
+ +

제4조 (회원가입 및 계정관리)

+
    +
  1. 이용자는 소셜 로그인 등을 통해 약관 동의 후 서비스를 이용할 수 있습니다.
  2. +
  3. 회원은 자신의 계정 및 식별코드 관리에 대한 책임을 지며, 타인의 정보 도용 시 서비스 이용이 영구 제한될 수 있습니다.
  4. +
+ +

제5조 (서비스 이용 및 제한)

+
    +
  1. 회사는 다음의 경우 이용을 제한하거나 게시물을 삭제할 수 있습니다. +
      +
    • 자동화된 수단(매크로, 봇 등)을 이용하여 부정한 방법으로 투표하거나 내공을 쌓는 행위
    • +
    • 서비스 내에서 타인에게 불쾌감을 주는 욕설, 비하, 특정 사상 강요 등의 행위
    • +
    +
  2. +
  3. 일일 투표 참여 한도를 초과한 경우, 광고 시청 등을 통해 추가 참여권을 획득해야 합니다.
  4. +
+ +

제6조 (저작권 및 데이터 활용)

+
    +
  1. 서비스 내 모든 콘텐츠와 성향 분석 리포트의 디자인/알고리즘에 대한 저작권은 회사에 귀속됩니다.
  2. +
  3. 회원은 자신의 분석 결과를 비영리적인 목적으로 소셜 미디어 등에 자유롭게 공유할 수 있습니다.
  4. +
  5. 회사는 서비스 고도화를 위해 이용자의 투표 데이터를 익명화하여 통계 및 분석 자료로 활용할 수 있습니다.
  6. +
+ +

제7조 (책임제한)

+
    +
  1. 회사는 천재지변, 기간통신사업자의 장애 등 불가항력으로 인한 서비스 중단에 책임을 지지 않습니다.
  2. +
  3. 회사는 콘텐츠가 담고 있는 철학적 견해의 객관적 타당성을 보장하지 않으며, 이용자의 선택에 따른 심리적 변화나 결과에 대해 책임을 지지 않습니다.
  4. +
+ +

제8조 (준거법 및 관할법원)

+
    +
  1. 본 약관의 해석 및 회사와 이용자 간의 분쟁에는 대한민국 법률을 적용합니다.
  2. +
  3. 서비스 이용과 관련하여 발생한 분쟁은 회사의 본사 소재지 관할 법원을 제1심 합의관할 법원으로 합니다.
  4. +
+ +

부칙
본 약관은 2026년 4월 5일부터 시행됩니다.

+ + +