devch

회사에서 한 일 / 워크플러스

워크플러스

신규 B2B 근태 솔루션, 본인 포함 3인 개발팀의 개발 리더

사내 신규 근태 솔루션입니다. 개발 리더로 모바일 앱과 백엔드 기능을 설계하고 관리자 웹을 구현했습니다.

엘핀2025.03~ (진행 중)3인 개발팀개발 리더React 19TypeScriptViteReact NativeKotlin/Spring Boot
서명 결함2건

실제 DB를 쓰는 테스트로 찾아 CI에 넣음

무중단으로 바꾼 저장 방식3가지

관리자 토큰, 비밀번호 해시, 개인정보 컬럼

빌드 채널2개

고객용과 사내 관리자용, 한 코드베이스

개인정보 파기 흐름2026.10

서버와 관리자 화면에 반영

배경

고객용 앱과 사내 관리자 기능이 한 코드베이스에 있고 위치, 얼굴, 근무 공간 사진 같은 개인정보를 다룹니다.

워크플러스 관리자 웹
관리자 웹의 방문보고서 결과 화면 (회사 계정, 사용자 이름, 고객사 이름은 가림)

관리자 웹의 방문보고서 결과 화면 (회사 계정, 사용자 이름, 고객사 이름은 가림)

한 일과 판단

01

출퇴근 서명 검증 테스트를 만들어 CI에 넣었습니다

상황
단위 테스트가 모두 통과해도 실제 출퇴근이 막히는 문제가 있었습니다.
고른 것
실제 DB를 쓰는 테스트를 AI 코딩 에이전트와 함께 만들었습니다.
결과
앱이 서명할 수 없는 값이 서명 대상에 들어 있던 결함과 서버가 기록한 시각과 앱이 서명한 시각이 어긋나던 결함까지 2건을 찾아 고치고 이 테스트를 CI에 넣었습니다.
02

인증과 개인정보 저장 방식을 서비스를 멈추지 않고 바꿨습니다

관리자 토큰
관리자 웹 토큰을 localStorage에서 스크립트가 읽을 수 없는 HttpOnly 쿠키로 옮기고 탭 사이 동기화에도 토큰 원문을 싣지 않게 했습니다. 오래 열어 둔 관리자 화면은 쿠키로 세션을 되살립니다.
비밀번호 해시
한국인터넷진흥원(KISA) 권고 알고리즘 기준에 맞추려고 비밀번호 해시를 bcrypt에서 새 해시 방식(PBKDF2)으로 바꿨습니다. 사용자가 로그인할 때 새 방식으로 다시 저장해 서비스를 멈추지 않고 옮기고 bcrypt로 새 비밀번호를 만드는 코드는 CI에서 막습니다.
개인정보 컬럼
DB의 개인정보 컬럼도 평문에서 암호문으로 단계를 나눠 무중단으로 바꾸고 되돌리기 스크립트를 함께 만들었습니다.
03

탈퇴자와 계약 종료 회사의 개인정보 파기 흐름을 만들었습니다

상황
계약이 끝난 고객사의 개인정보는 가명처리하되 법적 증빙은 그대로 남긴다는 기준을 PX 팀 리뷰에서 정했습니다.
고른 것
탈퇴자 정보는 바로 지울 것과 2년 보존할 것으로 나누고 계약이 끝난 회사는 가명으로 보존한 뒤 최종 소거하는 흐름을 판정 기준 하나로 묶어 서버와 관리자 화면에 만들었습니다.
결과
2026년 10월 릴리스에 반영했습니다.
04

고객용 빌드에 사내 관리 코드가 섞이면 빌드가 멈추게 했습니다

상황
한 코드베이스에서 고객용 번들과 사내 관리자용 번들을 함께 만듭니다.
고른 것
CI에서 빌드 산출물을 검사하는 스크립트를 넣어 고객용 번들에 사내 관리 코드가 섞이면 빌드가 멈추게 했습니다.
고객용 빌드에 사내 코드가 섞이면 CI에서 멈추는 빌드 구조
고객용 빌드에 사내 코드가 섞이면 CI에서 멈추는 빌드 구조
05

공간이미지 인증의 사진 수집은 서버가 정하게 했습니다

상황
사진으로 위치를 인증하는 공간이미지 인증 기능을 넣었습니다.
고른 것
회사 수집 정책과 직원 동의를 서버에서 둘 다 확인해야 사진을 수집하고 하나라도 아니면 출근은 막지 않고 수집만 건너뛰게 했습니다.
06

일부 기기에서 멈추던 얼굴 인식 카메라를 실기기에서 좁혔습니다

상황
레거시 얼굴 인식 네이티브 모듈을 React Native 새 아키텍처로 옮긴 뒤 특정 기기에서 카메라가 멈췄습니다.
원인
실기기에서 재현해 시스템 로그를 모아 분석해 GPU 가속 호환성 문제까지 좁혔습니다.
고른 것
상위 오픈소스 라이브러리에 이슈를 올리고 GPU가 실패하면 CPU로 처리하는 대체 경로를 넣었습니다.