Skip to content

feat: 인앱 브라우저 구글 로그인 외부 브라우저 우회#242

Merged
Junhyukkkk merged 1 commit into
developfrom
feature/inapp-browser-oauth-redirect
Jun 21, 2026
Merged

feat: 인앱 브라우저 구글 로그인 외부 브라우저 우회#242
Junhyukkkk merged 1 commit into
developfrom
feature/inapp-browser-oauth-redirect

Conversation

@Junhyukkkk

@Junhyukkkk Junhyukkkk commented Jun 21, 2026

Copy link
Copy Markdown
Member

📌 관련 이슈

  • closes #

🔍 작업 내용

스레드 등 인앱 브라우저(WebView)에서 구글 로그인 시 403(disallowed_useragent)으로 막히는 문제를 해결했습니다.
구글이 보안 정책상 WebView에서의 OAuth 로그인을 차단하기 때문에, 인앱 브라우저로 로그인 진입 시 외부 브라우저로 우회시킵니다.

📝 변경 사항

  • InAppBrowserDetector 추가: User-Agent로 인앱 브라우저 / Android / iOS 판별
    • 안드로이드 WebView 공통 마커(; wv)) + Threads(Barcelona)/Instagram/Facebook/카카오톡/라인/네이버/다음/밴드 등 앱 시그니처 감지
  • InAppBrowserRedirectFilter 추가: /oauth2/authorization/** 진입 요청을 가로채 외부 브라우저로 우회
    • 안드로이드: intent:// 스킴으로 크롬 강제 실행 (크롬 미설치 시 fallback_url로 폴백)
    • iOS: 사파리 강제 실행이 불가능해 "외부 브라우저로 열기" 안내 페이지 + 주소 복사 제공
    • 외부 브라우저에서 같은 URL로 OAuth 흐름을 새 세션에서 재시작
  • SecurityConfig: OAuth2AuthorizationRequestRedirectFilter 앞에 필터 등록 (구글 리다이렉트 전에 동작)
  • InAppBrowserDetectorTest 추가: UA 판별 로직 검증

💬 리뷰어에게

  • iOS는 WebView에서 사파리를 코드로 강제 실행할 방법이 없어 안내 페이지가 한계입니다(구글 정책상 불가피한 표준 방식). 안드로이드는 자동으로 크롬이
    열립니다.
  • 필터를 @Component 빈이 아니라 SecurityConfig에서 직접 new로 생성했습니다. OncePerRequestFilter를 빈으로 등록하면 전체 서블릿 체인에도
    중복 등록되기 때문에 시큐리티 체인에만 적용되도록 했습니다.
  • 감지 대상 앱을 추가/조정하려면 InAppBrowserDetectorIN_APP_PATTERN 한 곳만 수정하면 됩니다.

Summary by CodeRabbit

릴리스 노트

  • New Features

    • 인앱 브라우저(WebView) 환경에서 소셜 로그인이 외부 브라우저로 자동 우회되도록 개선
    • Android에서는 Chrome을 통한 로그인 진행, iOS에서는 Safari를 통한 로그인 안내 제공
  • Tests

    • 인앱 브라우저 감지 및 OS 판별 기능에 대한 테스트 추가

@Junhyukkkk Junhyukkkk self-assigned this Jun 21, 2026
@coderabbitai

coderabbitai Bot commented Jun 21, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

Pull request was closed or merged during review

Walkthrough

InAppBrowserDetector UA 판별 유틸리티를 추가하고, 이를 사용하는 InAppBrowserRedirectFilter를 구현해 OAuth2 소셜 로그인 진입 경로에서 인앱 브라우저를 감지하면 Android/iOS별 외부 브라우저 안내 HTML을 반환한다. SecurityConfig에 해당 필터를 등록하고 단위 테스트를 포함한다.

Changes

인앱 브라우저 OAuth2 외부 브라우저 우회

Layer / File(s) Summary
UA 판별 유틸리티 및 테스트
src/main/java/com/ject/vs/config/InAppBrowserDetector.java, src/unitTest/java/com/ject/vs/config/InAppBrowserDetectorTest.java
UA 문자열 기반으로 인앱 브라우저(Facebook·Instagram·KakaoTalk 등), Android, iOS 여부를 정규식으로 판별하는 정적 메서드를 제공하며, null/공백 처리와 다양한 UA 케이스를 JUnit5로 검증한다.
인앱 브라우저 리다이렉트 필터
src/main/java/com/ject/vs/config/InAppBrowserRedirectFilter.java
/oauth2/authorization/** 요청을 인앱 브라우저에서 감지하면 Android는 intent:// 기반 Chrome 강제 실행 HTML을, iOS는 Safari 안내 및 주소 복사 버튼 HTML을 직접 응답으로 반환한다. buildExternalUrlescapeHtml/escapeHtmlAttr/escapeJs 헬퍼를 포함한다.
SecurityConfig 필터 체인 등록
src/main/java/com/ject/vs/config/SecurityConfig.java
InAppBrowserRedirectFilterOAuth2AuthorizationRequestRedirectFilter 앞에 삽입해 기존 JWT 필터 등록 방식과 함께 필터 체인에 통합한다.

Sequence Diagram(s)

sequenceDiagram
  participant Client as 인앱 브라우저 클라이언트
  participant InAppFilter as InAppBrowserRedirectFilter
  participant Detector as InAppBrowserDetector
  participant OAuthFilter as OAuth2AuthorizationRequestRedirectFilter

  Client->>InAppFilter: GET /oauth2/authorization/google
  InAppFilter->>Detector: isInAppBrowser(User-Agent)
  Detector-->>InAppFilter: true
  InAppFilter->>InAppFilter: buildExternalUrl(request)
  alt Android
    InAppFilter-->>Client: intent:// Chrome 강제 실행 HTML
  else iOS
    InAppFilter-->>Client: Safari 안내 + 주소 복사 HTML
  end

  Note over Client,OAuthFilter: 인앱 브라우저가 아닌 경우
  Client->>InAppFilter: GET /oauth2/authorization/google
  InAppFilter->>Detector: isInAppBrowser(User-Agent)
  Detector-->>InAppFilter: false
  InAppFilter->>OAuthFilter: doFilter(request, response)
  OAuthFilter-->>Client: Google OAuth2 리다이렉트
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 토끼가 앱 속 창에서 로그인하려 했더니,
필터가 손을 내밀어 "잠깐, 여기서 멈춰!"
Android엔 intent://, iOS엔 Safari 안내,
UA 하나하나 정규식으로 살펴보며,
외부 브라우저로 폴짝 뛰어나가는 길을 열었네. 🌐✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 18.75% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목이 주요 변경사항을 명확하게 요약하고 있으며, 인앱 브라우저 감지 및 Google 로그인 우회 기능이라는 핵심 목표를 정확하게 반영합니다.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/inapp-browser-oauth-redirect

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions

Copy link
Copy Markdown

빌드 성공
배포 준비 완료!

@Junhyukkkk Junhyukkkk merged commit 024f680 into develop Jun 21, 2026
4 of 5 checks passed
@Junhyukkkk Junhyukkkk deleted the feature/inapp-browser-oauth-redirect branch June 21, 2026 06:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant