BCrypt 암호화하는 과정이 궁금합니다.
미해결
Spring Boot JWT Tutorial
에러 안나고 결과도 잘 나오는데 LoginDto에 password가 어떻게 user 테이블에 있는 암호화된 비밀번호랑 비교돼서 동일한 결과값으로 판단돼서 토큰이 나오는지 궁금합니다. 제가 아직 부족해서인지 따라가면서 봐도 입력받은 password로 암호화하는 작업이 안보여서요
- jwt
- bcrypt
- spring-boot
173만명의 커뮤니티!! 함께 토론해봐요.
미해결
Spring Boot JWT Tutorial
에러 안나고 결과도 잘 나오는데 LoginDto에 password가 어떻게 user 테이블에 있는 암호화된 비밀번호랑 비교돼서 동일한 결과값으로 판단돼서 토큰이 나오는지 궁금합니다. 제가 아직 부족해서인지 따라가면서 봐도 입력받은 password로 암호화하는 작업이 안보여서요
미해결
[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
안녕하세요, 제로초님! 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]
강의의 내용와 조금 동떨어진 질문일 수 있지만 글 올려 봅니다. 무관하시다 생각하시면 답변 달아주지 않으셔도 좋습니다. 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
안녕하세요. 강의 잘 듣고 있습니다! 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를 사용할 필요가 없지 않나 생각이 듭니다.