
회사에서 버전 업을 진행하면서, 로그인 진행 시 비밀번호가 평문으로 전송되던 부분에 대한 리팩토링 요청이 들어왔다.
v2 회원가입 전반을 개발했었지만, 당시에 이해하기 어려웠던 부분이 존재했었으므로 백엔드 중점으로 정리해보고자 한다.
프론트 관련해서 궁금한 부분이 있긴 한데, 이건 어떻게 구현되었는지 직접 여쭤보고 설명을 들어야 확실하게 정리가 가능할 것 같으므로! 지금은 keep.
우리 회사의 로그인 과정은 크게 두 개의 프로젝트 (IDE project unit) 가 연관되어 있다.
즉, 로그인 프로세스는 web-api -> authorization-api 구조로 청사진을 그려볼 수 있다.
우리는 회원가입을 할 때 비밀번호를 입력하고, 이후 로그인을 시도할 때 입력하는 비밀번호와 우리가 이전에 입력했던 비밀번호가 동일한지 확인하는 검증 과정을 거친다.
그럼 회원가입 당시 입력했던 비밀번호는 DB에 평문 그대로 저장되어 있을까?
절대 아니다.
DB가 유출될 경우, 사용자의 계정이 탈취당할 수 있으므로 변환해서 저장해야 한다.
이때, 비밀번호는 복호화(= decode)가 가능하면 안되므로 단방향 encode 의 일환인 해싱(hashing) 을 활용한다.
이때, Spring 에서는 PasswordEncoder라는 인터페이스를 제공한다.
PasswordEncoder의 메서드를 활용하여 회원가입 시 입력한 비밀번호를 해시로 변환하여 DB에 저장한다.
1과 2의 내용을 조합하여 간략히 정리해보자면 다음과 같다.
(1) (web-api) 사용자가 회원가입 시, id 및 password 를 입력한다.
(2) (web-api -> authorization-api) RestTemplate 또는 FeignClient 등을 활용하여 authorization-api 로 데이터를 serving 한다.
(3) (authorization-api) 회원가입 과정을 진행한다.
(1) (web-api) 사용자가 로그인 시, id 및 password 를 입력한다.
(2) (web-api) authorization-api 의 /sign-in 에 데이터를 serving 한다.
(3) (authorization-api) 로그인 과정 중, DB에 저장되어 있던 해싱된 비밀번호와 서빙된 비밀번호를 비교한다.
여기까지 정리했을 때, 요점은 web-api 에서 요청받은 유저가 입력한 비밀번호가 평문으로 authorization-api 로 전송된다는 것이다.
따라서, AES-256 을 도입하면
4의 내용을 다시 한 번 정리해보자.
이렇게 코드를 제외하고, 간단히 context 를 정리해보았다.
하지만 개발 포스팅을 적을 때마다 느끼는 건 코드가 있어야 완성이라는 느낌을 지울 수 없다는 것..
그렇지만 회사 코드를 유출하고 싶은 마음 또한 0에 수렴하기 때문에 항상 고민이다. 🐰🤔