Electron 앱에서 로그인 기능을 구현할 때, 앱 내부에서 인증을 직접 처리하지 않고 외부 브라우저 기반 웹 인증 후 딥링크로 앱에 복귀하는 구조를 설계했습니다. 이 방식은 reCAPTCHA, 이메일 인증, 비밀번호 재설정 같은 웹 중심 인증 기능을 안정적으로 운영하고, 인증 정책 변경을 앱 배포 없이 빠르게 반영할 수 있다는 장점이 있습니다. 다만 외부 브라우저를 거치는 구조에서는 “정말 이 앱에서 시작한 로그인 요청의 결과인지”를 검증해야 했기 때문에, 단순히 로그인 성공 후 앱으로 돌아오게만 해서는 CSRF, 딥링크 주입, 오래된 인증 응답 재사용 같은 문제가 생길 수 있었습니다. 실제로 비밀번호 재설정 플로우에서는 서버가 새 state를 발급하면서, 앱이 처음 로그인 시작 시 기억한 state와 달라져 인증 상태 불일치 오류가 발생하는 문제가 있었습니다.
해결 방법 앱에서 로그인 시작 시 1회용 state와 redirectUri를 발급받아 저장하고, 웹 로그인은 이 값을 포함한 요청만 처리하도록 딥링크 인증 흐름을 설계했습니다. 서버는 로그인 성공 시 발급한 code를 해당 state에 묶어 저장하고, 앱이 최종적으로 인증 교환을 요청할 때 동일한 state인지 다시 검증하도록 구성해 요청 연관성을 보장했습니다. 또한 비밀번호 재설정 토큰에도 기존 state, redirectUri를 함께 보존하도록 구조를 확장해, 재설정 완료 후 새로운 인증 컨텍스트를 만들지 않고 원래 로그인 흐름을 그대로 이어가도록 개선했습니다.
Before: 웹 인증은 가능하지만 요청 연관성 단절 앱 로그인 시작 state=A 저장 웹에서 비밀번호 재설정 서버가 새 state=B 발급 웹 로그인 성공 후 앱 복귀 앱이 A !== B 검증 실패 인증 상태 불일치 오류 발생
After: state 기반 딥링크 인증/인가 흐름 설계 앱 로그인 시작 state=A, redirectUri 발급 및 저장 웹 로그인/비밀번호 재설정에서도 기존 state=A 유지 로그인 성공 시 1회용 code를 state=A와 바인딩 딥링크로 앱 복귀 앱이 동일한 state를 검증한 뒤 세션 교환 완료
결과 외부 브라우저 기반 로그인 구조를 유지하면서도, 앱에서 시작한 로그인 요청만 안전하게 앱으로 복귀할 수 있도록 인증 흐름을 완성했습니다. 딥링크 기반 로그인에서 CSRF와 응답 재사용 문제를 줄였고, 비밀번호 재설정 이후에도 로그인 흐름이 끊기지 않도록 개선했습니다.