만약 인증 과정을 거치지 않고 이메일과 관련된 정보들을 얻는다고 했을 때, 위의 그림처럼 설계가 된다.
but, 위의 처럼 만들었을 때 보안상의 이슈가 발생하게 된다. 누구라도 이메일을 알고 있으면 모든 부가 정보에 접근할 수 있다.
password를 추가하여 요청했을 때 server는 DB에서 이메일과 패스워드를 받아 client에서 받은 정보와 대조하여 데이터가 맞으면 요청한 데이터를 주도록 한다. but, 이것만으로도 보안상의 이슈가 해결된 것이 아니다. 서버에는 문자 그대로의 password가 DB에 저장될 것이고 만약 해커가 DB에 접근해 password 데이터를 가져간다면 사용자가 똑같은 암호를 쓴 다른 server에서도 데이터를 훔쳐갈 수 있게 된다. 그래서 password를 암호화하여 DB 저장하는 작업이 필요하다.
암호와는 일련의 정보를 임의의 방식을 사용하여 다른 형태로 변환하여 해당 방식에 대한 정보를 소유한 사람을 제외하고 이해할 수 없도록 '알고리즘'을 이용해 정보를 전달하는 과정
client에서 받은 비밀번호를 서버측에서 암호화를 해서 DB에 저장 & 대조한다. DB에서 password가 노출되었을 때 Authentication ( Plaintext ) 때 말했던 보안상의 이슈를 해결할 수 있게 된다.
어떠한 문자열에 '임의의 연산'을 적용하여 다른 문자열로 변환하는 것
대표적인 HASH ALGORITHM: SH1, SH256
해시 하려는 값(원본)에 추가하는 값
유저마다 Salt를 다르게 한다.
NodeJS 내장 암호화 모듈
<script>
const crypto = require('crypto');
const secret = 'abcdefg'; // Salt
const hash = crypto.createHmac('sha256', secret) // 알고리즘 방식은 무엇으로 할지
.update('I love cupcakes') // Hashing 할 값
.digest('hex'); // 인코딩 방식
console.log(hash);
// Prints:
// c0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658e
</script>
값 + Salt => 알고리즘으로 값 변환 => 변환 값을 입력 받은 방식으로 인코딩 => Hash 값
출처: CODESTATES