묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Spring Boot JWT Tutorial
BCrypt 암호화하는 과정이 궁금합니다.
에러 안나고 결과도 잘 나오는데LoginDto에 password가 어떻게 user 테이블에 있는 암호화된 비밀번호랑 비교돼서 동일한 결과값으로 판단돼서 토큰이 나오는지 궁금합니다. 제가 아직 부족해서인지 따라가면서 봐도 입력받은 password로 암호화하는 작업이 안보여서요
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
bcrypt의 compare메서드의 리턴값이 계속 false로 나오는데요, 어떻게 하면 true를 반환할까요
안녕하세요, 제로초님! bcrypt의 compare 함수의 return 값이 계속 false가 나와서, 혹시 제시해주실 힌트가 있으실지 글을 남겨봅니다 이와 관련해 구글링에서 제시한 방법들을 적용해봤는데도, 계속적으로 false가 리턴됩니다ㅠ… : 1. password 타입의 length를 늘리기(데이터가 짤려서 출력될 수 있다고 하여,,) : 2. password 타입을 string 타입으로 변환? 후 디비에 저장하기 : 3. pre 미들웨어를 사용할 경우, pre()특성상 반복적?으로 pwd를 해싱하기 때문에 isModified()/ .isNew() 일 경우를 추가하기 : 4. compare()함수의 인자를 작성시, 인자의 순서 체크 - 첫번째인자는 유저가 입력한것, 두번째는 hashed되어 디비에 저장된 패스워드로 입력하기 위와 같이 해결방법을 찾았는데요,,, 1,2번은 이미 mongoose에서 해결해주는 부분이라 패스하고,,, 3,4번은 적용을 했는데도 ㅠ comprare함수의 리턴값이 false로 나옵니다,,, compare함수의 리턴값이 false여도... false를 true라고;;; 조건식을 변경하면;;;; 입력한 값에 해당하는, json객체가 출력되어 문제는 없지만,,,, (아래 authController.js파일, !passwordMatch를 passwordMatch로 변경하면 원하는 로직대로 나오지만 ㅠ ) (폼에 입력한 값에 해당한, json객체가 나와서 문제는 없는데..) false를 true라고 가정하고;; 코드를 변경하면 원하는 결과를 얻게 되는데,,, 작성된 코드가 ,,,이건 아닌거 같아서요 ㅠ 왜 계속,,,false를 반환할까요,,;; bcrypt말고 다른 라이브러리를 사용해야할까요?? 감사합니다, p.s) 추가 질문입니다. 1. issModified(‘password’) || isNew()User.js 내용 중 UserSchema.pre('save', async function () {…} 부분에서, isModified(‘password’) || isNew() 이하 블록이 실행되는 조건은, password가 변경되거나 처음 입력될 경우 실행되는 건지요, 제가 잘 이해하고 코드를 작성했는지 궁금합니다 2. 에러 핸들링 bycript 공식홈페이지나 관련 코드를 구글링을 해보면, 코드를 콜백방식으로 작성한걸 심심치 않게 볼수 있는데요, 저는 async-await로 작성해서, 이걸어떻게 에러 핸들링 코드를 작성해야할까요? try..catch로도 충분할까요? -------------------------------------------------------------------------------------------------------------------------- User.js import bcrypt from 'bcrypt'; import mongoose from 'mongoose'; const UserSchema = new mongoose.Schema( { …중략… password: { type: String, required: true, min: 6, }, …중략… }, { timestamps: true } ); UserSchema.pre('save', async function () { try { const salt = await bcrypt.genSalt(10); if (this.isModified('password') || this.isNew()) { this.password = await bcrypt.hash(this.password, salt); } } catch (err) { console.log(err); } }); const User = mongoose.model('User', UserSchema); export default User; authController.js export const login = async (req, res) => { try { const { body: { email, password }, } = req; const user = await User.findOne({ email: email }); if (!user) { // user가 ! 없는것이 맞다(true)면 = user가 없다면 return res.status(404).json({ error: 'user is not found' }); } else { const passwordMatch = await bcrypt.compare(password, user.password); //부정문을 먼저 시작하는 조건식 // passwordMatch가 false로 나와 계속 { error: 'Invalid Password' }를 출력 // !passwordMatch에서 !을 제거하면 원하는 결과 도출 if (!passwordMatch) { // match되는 password가 !없다는게 맞다(true)면 = return res.status(400).json({ error: 'Invalid Password' }); } return res.status(200).json(user); } } catch (err) { return res.status(401).json(err); } };
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
NestJS Dockerizing Error loading shared library bcypt 에러
강의의 내용와 조금 동떨어진 질문일 수 있지만 글 올려 봅니다. 무관하시다 생각하시면 답변 달아주지 않으셔도 좋습니다. auth 기능을 로컬에서 구현 후, dockerizing 하는 부분에서 Error: Error loading shared library /gateway/node_modules/bcrypt/lib/binding/napi-v3/bcrypt_lib.node: Exec format error 와 같은 에러가 나서 구동되지 않습니다. Dockerfile 은 FROM node:12-alpine RUN apk update && apk add --no-cache curl vim bash WORKDIR /app COPY package*.json ./ RUN npm install COPY . . 이고, bcrypt 는 npm i bcrypt npm i -D @types/bcrypt 로 하여 설치하였습니다. container 안에서 npm i bcrypt npm i -D @types/bcrypt 명령어를 이용해서 bcrypt 를 다시 설치하면, 정상적으로 구동됩니다.
-
미해결따라하며 배우는 NestJS
salt 이용하여 패스워드 생성후, 나중에 패스워드 비교할때 salt값이 필요하지 않나요?
안녕하세요. 강의 잘 듣고 있습니다! bcrypt를 이용한 패스워드 생성, 비교할때 궁금점이 생겼습니다. const salt = await bcrypt.genSalt() const hashedPassword = await bcrypt.hash(password, salt) 이렇게 password 생성하여 저장했으면, 로그인할때 password 값 비교할때 저 방식과 똑같이 password 생성하여 DB에 저장되어있는 값과 비교해야하지 않나요? bcrypt.compare(password, user.password) 기존 password와 사용자가 입력한 password를 이렇게 단순 비교해도 성공하는 이유가 무엇인가요? 이렇게 되면 salt를 사용할 필요가 없지 않나 생각이 듭니다.