state: {
type: String,
default: 'FOR_SALE',
},
상품 작성 시
FOR_SALE)및 판매 완료(SOLD_OUT) 를 가질 수 있습니다.FOR_SALE) 입니다.다음과 같은 조건을 만족시켜야 했는데, 나는 FOR_SALE 값만 디폴트 값으로 넣어주었기 때문에 사실 이 데이터에 다른 값이 들어갈 수 있게 되었다... 기존에는 select 항목에서 옵션 두 개만 선택 가능하도록 구현되어 있어 아마 데이터를 넣을 땐 문제가 없겠지만 해설영상을 보면서 몽구스의 다른 기능을 알게 되었다.
mongoose.Schema에서 enum
스키마 생성 시 특정 필드에 대한 value를 제한하는 것
state: {
type: String,
default: 'FOR_SALE',
enum : ['FOR_SALE','SOLD_OUT']
},
이렇게 수정해 줌
어제, 비밀번호 해싱을 위해 비크립트라는 노드 라이브러리를 설치했었다. 해당 라이브러리를 기반으로 암호화와 체크 함수를 만들었다. 비크립트는 단방향 라이브러리라 복호화가 불가능하다고 한다...
다음과 같이 구현함
import bcrypt from 'bcrypt';
export async function hashPassword(password) {
const saltRounds = 10;
return await bcrypt.hash(password, saltRounds);
}
export async function checkPassword(inputPassword, storedHash) {
return await bcrypt.compare(inputPassword, storedHash);
}
bcrypt는 promise를 지원한다고 함! async/await 사용가능하다.
일단 해싱과 체크에는 bcrypt.hash와 bcrypt.compare를 이용하면 된다...
비크립트에 대해 알아보며 salt가 뭔지 찾아봤다. 비크립트가 해싱에 사용하는 방법이 바로 Adding Salt라고 함.. 쉽게 말해 salt라는 임의의 데이터를 더해서 암호화한단 뜻이당.
비밀번호 저장하기
1. SPRNG를 사용해서 임의의 소금값을 생성한다.
2. 소금값을 비밀번호 앞에 덧붙이고 SHA256 같은 표준 암호화 해시 함수를 사용해서 해시한다.
3. 소금값과 해시값을 사용자 계정 테이블에 저장한다.
비밀번호 유효성 검사
1. 사용자의 소금값과 비밀번호 해시값을 데이터베이스에서 찾는다.
2. 입력한 비밀번호에 소금값을 덧붙이고 비밀번호 해싱에 사용했던 동일한 해싱함수를 사용하여 해싱한다.
3. 입력한 비밀번호로 생성한 해싱값과 저장되어 있는 해싱값과 비교해서 일치하는지 확인하고 동일 하면 비밀번호가 정확한 비밀번호를 입력한것이고 아니면 잘못된 비밀번호를 입력한 것이다.
출처: https://starplatina.tistory.com/entry/비밀번호-해시에-소금치기-바르게-쓰기
saltRounds : 'salt'를 붙이고 해쉬를 반복할 수를 정해준다. 뭔 말인지 모르겠는데 salt 데이터의 길이라고 이해하면 쉬울 것 같다... 길수록 암호화가 정교하게 되지만 해싱에 시간과 자원을 많이 잡아먹는다.
일반적으로 10~12정도 사용한다고 해서 나도 saltRounds는 10을 주었다.
aws로 배포하려고 하는데 또다시 mongoDB 연결이 안 되는 문제가 발생했다.
원인은... gitignore에 .env 파일을 등록해 두는 바람에 MONGOD_ADDR로 등록해둔 전역변수를 git clone을 통해 불러올 수 없었던 것.
$ sudo vim .env
로 우분투 환경에서 직접 env 파일을 생성해줘서 해결했다...