첫번째 프로젝트를 진행하면서, 유저가 회원가입할 때 입력한 정보를 DB에 저장할 때 아무 생각 없이 비밀번호 그대로 저장하면 될 줄 알았습니다.
그러나 생각을 해보니, 서버의 데이터베이스가 털려버리거나, 백엔드 개발자가 악의를 품고 그 정보들을 공개해버릴 수 있겠다...는 위험한 생각이 들었습니다.
그렇기 때문에, 암호화된 비밀번호를 DB에 등록해야했습니다. 다양한 비밀번호 해싱 알고리즘이 있었지만, AES 256 알고리즘을 사용했습니다.
AES는 Advanced Encryption Standart 의 약자입니다. 고급 암호화 표준인데, 암호화 및 복호화가 가능한 양방향 해싱 알고리즘입니다.
뒤에 붙은 숫자로는 128, 192, 256 등이 오는데, 이 숫자는 암호화 및 복호화에 사용되는 키의 길이를 의미합니다.
해싱 알고리즘은 양방향과 단방향이 존재합니다.
두 알고리즘의 차이는 양방향 해싱 알고리즘은 암호화된 값을 다시 암호화 전으로 돌릴 수 있는 복호화가 가능하고, 단방향 해싱 알고리즘은 복호화가 불가능하며, 오직 암호화만 가능합니다.
암호화 및 복호화는 다음과 같은 과정으로 이루어집니다.
암호화
plain text => plain bytes => encrypt => encrypted bites => encrypted base64 text
복호화
AES-256 해싱 알고리즘은 양방향 해싱 알고리즘이며, 이를 수행하기 위해 필요한 값들이 있습니다.
여러가지 필요한 값들이 있지만, 꼭 필요한 값 두가지가 있습니다.
먼저 사용자가 입력한 plain text
가 있습니다. 이는 실제로 사용자가 회원가입 인풋 태그에 입력한 비밀번호 스트링 값이 됩니다.
두번째로,
서버에서 지정한 Salt
값입니다.
Salt
는 말 그대로, 입력받은 스트링 값에 소금을 치는 것입니다.
입력 받은 비밀번호를 그대로 해싱하는 것이 아니라, 서버에서 지정하여 유저는 알 수 없는 소금을 친 비밀번호를 해싱하는 개념입니다.
그렇기 때문에, 이 소금은 외부로 절대 유출되어선 안되며, 쉽게 연상할 수 있는 소금이 되어선 안됩니다.
짧은 2주 프로젝트를 위해 단방향 해싱보다 다소 간단할 수 있는 양방향 해싱을 사용했고, 시간이 더 많은 4주 프로젝트에선 단방향 해싱을 사용해볼 생각입니다.
AES256 모듈을 설치합니다.
npm i aes256
다음에도 재사용할 수 있으므로 암호화 / 복호화 함수를 만듭니다.
이제 클라이언트에서 서버로 회원가입 요청이 들어올 때, payload
에 담긴 비밀번호 plain text
를 해싱하여, 그 값을 DB에 저장합니다.
유저의 회원가입 요청이 성공하면, DB에는 암호화된 비밀번호가 저장되는 것을 확인할 수 있습니다.
유저가 로그인할 때, 유저가 입력한 plain text
와 DB에 저장된 해싱된 비밀번호는 다를 수 밖에 없습니다.
양방향 해싱 알고리즘인 AES 256은 DB에 저장된 해싱된 비밀번호를 복호화하여 유저가 입력한 plain text
와 비교합니다.
유저가 로그인할 때, 입력한 비밀번호와 DB에 저장된 비밀번호와 일치하는지 판단하기 위해, DB에 저장된 비밀번호를 복호화하여 비교할 수 있습니다.
다음 프로젝트 땐 단방향 해싱 알고리즘을 사용하여 더 보안성을 향상시켜보고 싶습니다.