# Discourse iOS 앱에서 OIDC 로그인이 가끔 콜백 시 csrf\_detected 오류로 실패함

**URL:** <https://meta.discourse.org/t/oidc-login-via-discourse-ios-app-occasionally-fails-with-csrf-detected-on-callback/394838>\
**Category:** SSO\
**Tags:** openid-connect\
**Created:** [1월 31, 2026, 11:51오전 UTC](https://meta.discourse.org/t/oidc-login-via-discourse-ios-app-occasionally-fails-with-csrf-detected-on-callback/394838 "2026-01-31T11:51:35Z")\
**Posts on this page:** 1\
**Showing post:** 4

<div class="post-metadata">

**Author:** ![Ethsim2](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/ethsim2/32/522255_2.png) [@Ethsim2](https://meta.discourse.org/u/Ethsim2)\
**Post date:** [2월 1, 2026, 11:55오전 UTC](https://meta.discourse.org/t/oidc-login-via-discourse-ios-app-occasionally-fails-with-csrf-detected-on-callback/394838/4 "2026-02-01T11:55:23Z")

</div>

이것이 간헐적인 동작이 아니라 결정론적인 WKWebView 제한 사항임을 확인하는 데 도움이 될 수 있는 추가 데이터 포인트가 하나 있습니다.

여러 번의 실패 사례에 걸쳐 nginx 접근 로그를 상관 분석해 보니, 사용자가 로그인을 재시도할 때 인앱 브라우저가 동일한 OIDC 상태(state) 값을 반복적으로 재사용하는 것을 발견했습니다.

예시(정리됨):  
• 동일한 상태 해시가 14회 확인됨  
• 모든 요청 출처:

```plaintext
Snapchat/13.77.0.51 (like Safari…, panda)

```

• 약 1시간에 걸친 반복적인 로그인 시도 사이에 분포  
• 각 시도는 다음과 같은 결과를 초래함:

```plaintext
/auth/oidc/callback → /auth/failure?message=csrf_detected

```

이는 강력하게 시사합니다:  
• 브라우저가 원래 상태를 포함하는 세션 쿠키를 성공적으로 저장하지 못함  
• 각 재시도가 동일한 오래된 상태 매개변수를 재사용함  
• 따라서 Discourse가 매번 콜백을 올바르게 거부함

반면, 동일한 사용자가 Safari에서 해당 링크를 열면 새로운 상태가 생성되고 즉시 로그인에 성공합니다.

따라서 이는 타이밍이나 레이스 컨디션이 아니라, 특정 iOS 인앱 브라우저에서 완전히 결정론적인 실패 모드로 보입니다.

Discourse의 관점에서, CSRF 보호는 의도대로 정확히 작동하고 있으며, 단순히 브라우저 환경이 필요한 세션 연속성을 유지할 수 없는 것입니다.

저는 이것이 다음을 추가로 뒷받침한다고 생각합니다:  
• 이는 테마 컴포넌트나 클라이언트 JS로 완화할 수 있는 문제가 아님  
• 그리고 유일한 신뢰할 수 있는 처리 방법은 서버 측 메시징 및 문서화임

이 데이터 포인트가 예상 동작을 확인하는 데 유용할 수 있기를 바라며 게시합니다.

---

_[View the full topic](https://meta.discourse.org/t/oidc-login-via-discourse-ios-app-occasionally-fails-with-csrf-detected-on-callback/394838)._
