비밀번호 관리, 다들 어떻게 하고 계시나요?
브라우저에 저장하거나, 메모장에 적어두거나, 아니면 그냥 기억력에 의존하거나. 저도 한때는 그랬어요. 그러다 결국 “아, 이건 안 되겠다” 싶은 순간이 오더라고요.
그래서 직접 만들었습니다. 비밀번호 관리 앱, Secret Vault.
시작은 단순했다 — “내가 필요하니까”
솔직히 말하면, 시중에 비밀번호 관리 앱은 넘쳐나요. 1Password, Bitwarden, LastPass… 다 좋은 앱들이죠. 근데 저한테는 뭔가 미묘하게 안 맞았어요.
구독 모델이 부담스럽기도 했고, 내 비밀번호가 다른 서버에 저장된다는 것도 찝찝했고, 무엇보다 “내가 원하는 방식으로 동작하는 앱”이 갖고 싶었어요.
“개발자가 제일 위험한 게 뭔지 아세요? ‘이거 나도 만들 수 있겠는데?’ 하는 생각이요.”
네, 그 위험한 생각을 했습니다. 그리고 실행에 옮겼어요. 결과물이 바로 Secret Vault입니다.
어떤 앱인가요?
한 줄로 요약하면 “로컬에서 동작하는 개인 비밀번호 금고”예요. 서버 없이, 내 폰 안에서만 모든 게 처리됩니다.
핵심 기능은 이래요:
- 마스터 비밀번호 하나로 금고 잠금/해제
- AES-256 암호화로 모든 비밀번호 암호화 저장
- 생체인증 지원 (지문, Face ID)
- 비밀번호 생성기 내장 (길이, 문자 종류 커스터마이징)
- 카테고리/검색 기능으로 쉽게 찾기
- 클립보드 자동 삭제 (30초 후 자동 정리)
기술 스택

Flutter를 메인 프레임워크로 선택한 이유는 간단해요. iOS랑 Android 둘 다 쓰거든요. 하나의 코드베이스로 두 플랫폼을 커버할 수 있다는 게 사이드 프로젝트에서는 치명적인 장점이에요.
상태관리는 Riverpod을 썼는데, Provider 패턴의 단점을 깔끔하게 해결한 라이브러리예요. 특히 의존성 주입이 자연스럽고, 테스트하기 편해서 선택했습니다. 로컬 저장소는 Hive를 사용했어요. SQLite보다 가볍고, Key-Value 형태라 비밀번호 같은 데이터 저장에 딱이었죠. 라우팅은 GoRouter로 타입 세이프하게 처리했고요.
Clean Architecture 적용기
“사이드 프로젝트에 Clean Architecture까지?” 싶을 수 있는데요. 저는 오히려 사이드 프로젝트니까 적용했어요. 회사 프로젝트는 이미 아키텍처가 정해져 있잖아요. 사이드 프로젝트야말로 내가 원하는 구조를 자유롭게 실험할 수 있는 공간이에요.

크게 4개 레이어로 나눴어요. Presentation Layer는 사용자가 보는 화면이에요. UI 위젯들이 여기에 있고, 비즈니스 로직은 절대 여기에 안 넣어요. Application Layer는 Riverpod Provider들이 모여있는 곳으로, UI와 Domain을 연결하는 역할을 합니다.
Domain Layer는 비즈니스 로직의 핵심이에요. 엔티티와 Repository 인터페이스가 정의되어 있고, 어떤 프레임워크에도 의존하지 않는 순수한 비즈니스 규칙만 담겨있죠. Infrastructure Layer는 실제 데이터를 다루는 곳으로, Hive DB 접근, AES 암호화 처리, 생체인증 연동 등 구체적인 구현이 여기에 있습니다.
암호화 — 이게 핵심이다
비밀번호 관리 앱에서 가장 중요한 건 당연히 보안이에요. 아무리 UI가 예뻐도 비밀번호가 평문으로 저장되면 의미 없잖아요.

저장할 때는 사용자가 입력한 비밀번호를 받아서, 마스터 비밀번호를 SHA-256으로 해싱해 AES 키를 만들어요. 랜덤 IV(16바이트)를 생성하고, AES-256 CBC 모드로 암호화한 뒤 IV_base64:Cipher_base64 형태로 Hive에 저장합니다.
꺼내볼 때는 반대로 Hive에서 암호화된 데이터를 읽어서, IV와 암호문을 분리하고 Base64 디코딩한 뒤, 마스터 비밀번호로 AES-256 복호화를 수행해요.
여기서 포인트는 복호화가 on-the-fly로 이루어진다는 거예요. 비밀번호를 보여줘야 하는 그 순간에만 복호화하고, 마스터 비밀번호는 세션 동안만 메모리에 유지해요. 클립보드에 복사하면 30초 후에 자동 삭제되고요. 마스터 비밀번호 자체도 SHA-256으로 10,000번 반복 해싱해서 저장하기 때문에 원본을 역추적하는 건 사실상 불가능해요.
앱 플로우
사용자 경험도 꽤 신경 썼어요. 보안 앱이라고 불편하면 결국 안 쓰게 되거든요.

앱을 처음 실행하면 Splash Screen에서 마스터 비밀번호가 설정되어 있는지 확인해요. 처음이면 Setup Screen으로, 이미 있으면 Lock Screen으로 이동합니다. Lock Screen에서는 비밀번호 입력 또는 생체인증(지문/Face ID)으로 잠금을 해제할 수 있어요. 매번 비밀번호 치기 귀찮잖아요. 지문 한 번이면 바로 금고가 열려요.
금고 화면에서는 저장된 비밀번호들을 카테고리별로 필터링하거나 실시간 검색할 수 있어요. 카테고리는 따로 설정하는 게 아니라 비밀번호를 저장할 때 입력한 값으로 자동 수집되는 구조예요.
만들면서 배운 것들
암호화 구현이 처음에는 겁났는데, Flutter에는 encrypt, crypto 같은 잘 만들어진 패키지가 있어서 AES-256 구현 자체는 생각보다 수월했어요. 물론 암호화 방식을 이해하는 과정이 더 중요했지만요.
Clean Architecture는 솔직히 처음에 “이렇게까지 나눌 필요가 있나?” 싶었어요. 파일 수도 많아지고, 보일러플레이트 코드도 생기고요. 근데 비밀번호 편집 기능을 추가할 때 Repository만 건드리면 되는 경험을 하고 나니까 확실히 체감이 되더라고요.
그리고 결정적으로, 내가 매일 쓸 앱을 만드는 건 동기부여가 완전히 다르다는 걸 느꼈어요. 사이드 프로젝트 10개 시작해서 1개 완성하면 다행인 거 다들 아시잖아요? Secret Vault는 진짜 내가 매일 쓸 앱이었기 때문에 완성할 수 있었어요.
앞으로의 계획
지금도 매일 잘 쓰고 있지만, 추가하고 싶은 기능은 아직 많아요. iCloud/Google Drive 백업, 브라우저 자동 채우기(Autofill), 비밀번호 건강 체크, 다크웹 유출 확인(Have I Been Pwned 연동) 같은 것들을 하나씩 천천히 추가해 나갈 예정이에요.
“내가 필요하니까 만든다”는 마음으로 시작한 프로젝트가 이렇게 하나의 완성된 앱이 됐어요. 개발자라면 이런 경험 한 번쯤은 해보시길 추천드려요. 기술 공부도 되고, 포트폴리오도 되고, 무엇보다 실제로 쓸 수 있는 결과물이 나온다는 게 가장 큰 보람이에요.
비슷한 프로젝트를 계획하고 계시다면, AES-256이나 Clean Architecture 관련해서 궁금한 점 있으면 편하게 댓글 남겨주세요.