보통 인증과정을 거치지 않고 정보들을 얻는다면?
여기서 문제점: 누구나 email을 알고 있다면 정보를 가져갈 수 있음
아! 그렇다면 비밀번호를 요청하자
1. client에 email에 관련된 정보를 비밀번호를 정하고 서버를 요청
2. 서버에서 email과 비번 정보를 DB에 보냄
3. 그 정보들을 비교하고 정상적으로 맞다면 DB에서 다시 해당 email을 가지고
서버에게 전달해 서버는 response하고 client가 가져감
여기서 문제점: DB에 접근 할 수 있다면 바로 비밀번호가 뚫림
이! 비밀번호를 데이터베이스에 암호화하여 저장하자
Encrypton이란?
암호화는 일련의 정보를 임의의 방식을 사용하여 다른 형태로 변환하여 해당 방식에 대한 정보를 소유한 사람을 제외하고 이해할 수 없도록 '알고리즘'을 이용해 정보를 관리라는 과정
[hash, salt]
[crypto 모듈을 사용한 암호화]
[쉽게 알아보는 서버 인증]
보통 웹앱에서 사용자 정보인 비밀번호를 DB에 저장할 때 보안을 위해 해싱 알고리즘을 이용하여 암호화(Encryption)시켜 비밀번호를 보호한다. 해싱이란 어떠한 문자열에 '임의의 연산'을 적용하여 다른 문자열로 변환하는 것을 말한다.
crypto란 node.js의 내장 모듈로서 암호화와 관련된 일을 처리한다.
const crypto = require('crypto');// 모듈
crypto.createHash('sha512'); // sha512 알고리즘
.update('hello') // hashing할 문자열(비밀번호)
// 'get coding' 이라는 문자열을 해싱하겠다는 의미.
.digest('base64') // output type(표시할 인코딩 설정)
// 해싱한 문자열을 base64로 인코딩하여 다이제스트를 반환한다.
// 다이제스트란 해시를 통해 얻어낸 암호화된 값을 뜻한다.
const crypto = require('crypto');// 모듈
crypto.createHmac('sha512', 'salt') // (알고리즘, salt값)
.update('hello') // hashing할 문자열(비밀번호)
.digest('hex') // output type(표시할 인코딩 설정)
해싱의 한계를 극복하기 위해, 해시 함수를 여러 번 반복하여 적용하거나 솔트(salt)를 활용할 수 있다.
crypto 모듈에서는 pbkd2(Password-Based Key Derivation Function 2)
라는 비동기 메서드를 통해 솔트를 적용할 수 있다.
const crypto = require('crypto')
// password, salt, iteration, 바이트 길이, 알고리즘, 콜백을 인자로 받는다.
crypto.pbkdf2('hello', 'salt', 123456, 64, 'sha512'
//(비번, salt값, 해싱반복횟수, 바이트, 알고리즘)
, (err, derivedKey)=> { // 콜백 (derivedKey: hashing한 값)
if(err) {
throw err
};
console.log(derivedKey.toString('hex'))
// hex로 인코딩한다.
})
randomBytes
이다const crypto = require('crypto');// 모듈
crypto.randomBytes(64, (err, buf)=>{
// 랜덤하게 생성된 버퍼를 base64를 통해 인코딩한다.
const randomlyGeneratedSalt = buf.toString('base64') // 랜덤으로 salt 생성
crypto.pbkdf2('hello', randomlyGeneratedSalt, 123456, 64, 'sha512'
// (비번, 랜덤으로 salt 생성한 값, 해싱반복횟수, 바이트기링, 알고리즘)
, (err, derivedKey)=>{ // 콜백 (derivedKey: hashing한 값)
if(err) {
throw err
};
console.log(derivedKey.toString('hex'))
})
})
쿠키는 사이트를 이용할때 브라우저에 저장되는 내용
쿠키에 저장하기 곤란한것들은 세션에 저장된다 생각하면 된다. 세션은 쿠키를 기반으로 한다.
쿠키는 브라우저가 무조건 가져야하는것(자동적으로 발생) 그러나 토큰은 무조건적은 아니다.. 보완성 있는 쿠키?