암호화 : Bcrypt 와 JWT

룰루팍 Lolo Park ·2022년 11월 30일
0

< Bcrypt >

//암호화 하고 검증하기

const bcrypt = require("bcrypt"); //bcrypt모듈을 불러와라

const password = "password"; //사용자실제비밀번호받는값
const saltRounds = 12; //cost factor로 8-12 값이 적당함

const makeHash = async (password, saltRounds) => {
  return await bcrypt.hash(password, saltRounds);
}; 

//bcrypt 모듈로 암호화를 사용할 때는 hash method를 사용
//hash메서드는 두개의 인자를 받는다. 
//문자열값과 Cost Factor값(password 값과 saltRounds라는 cost factor값)

//main함수를 통해 암호화를 진행해보자
const main = async () => {
  const hashedPassword = await makeHash(password, saltRounds); //password,saltRounds를 사용해 암호화를 진행하고 결과를 hasedPassword에 할당하고 값을 확인해보면
  console.log(hashedPassword);
};

main(); //====> main함수 호출을 통해 암호를 확인했다.

//hashedPassword 를 compare 하고 싶잖아

const checkHash = async (password, hashedPassword) => {
  return await bcrypt.compare(password, hashedPassword);
};

const mainCheck = async () => {
  const hashedPassword = await makeHash("password", 12);
  const result = await checkHash("passwooord", hashedPassword);
  console.log(result);
};

mainCheck(); //====>평문과암호화된값이같을때 true, 아닐때 false 출력

//password라는 문자열을 암호화 하였다.
//비교 대상도 password 라는 문자열.
  • cost factor : 란 무엇인가, salt rounds 라는 말에서 유추할 수 있듯이, salting 값을 몇번 주냐는 건가? 8-12번이 적당하고?(컴퓨터에 부담되지않게)

    bcrypt.hash(input1, input2)
    input1 = password 값(문자열)이 들어가고
    input2 = cost factor

const bcrypt = require("bcrypt"); 

const password = "password"
const saltRounds = 12;

const makeHash = async(password, saltRounds) => {

      return await bcrypt.hash(password, saltRounds);      
};

const main = async() => {

      const hashedPassword = await makeHash(password, saltRounds); 
      console.log(hasedRounds);
};

main();

const checkHash = async(password, hasedPassword) => {

      return await bcrypt.compare(password, hashedPassword);
};

const mainCheck = async() => {

      const hashedPassword = await makeHash("password", 12);
      const result = await checkHash("password", hashedPassword);
      console.log(result);
};

mainCheck();

< JWT >

const jwt = require("jsonwebtoken");

const payLoad = { foo: "bar" };

//토큰을 통해 실제로 전달할 내용을 변수 payLoad에 할당하도록한다
//객체의 형태로 할당한다. 실제 서비스에서는 노출되어도 되지만 사용자 정보를 알 수 있는것으로 할당.

const secretKey = "mySecretKey";
//secretKey 변수에 JWT의 signature를 만들때 사용할 secretkey를 할당
//secretkey는 유추할 수 없도록 규칙없는,적당히 긴 문자열로만들어야하고
//코드에 노출하면 절대 안됨

const jwtToken = jwt.sign(payLoad, secretKey);
//sign메서드는 필수로 2개의 인자를 받는데
//1st 는 payLoad를 2nd로는 secretkey
//3rd 인자에는 토큰을 만들 때 사용할 알고리즘을 넣을 수도 안넣을수도
//안넣으면 HS256방식으로 토큰을 생성

console.log(jwtToken); // =>>> JWT가 생성되었다!

const decoded = jwt.verify(jwtToken, secretKey);
//2nd인자인 secretKey 가
//JWT를 만들 때 사용된 secretKey와 같다면
//decoded 변수에 JWT의 payload가 할당된다.

console.log(decoded);

payLoad : JWT의 2번째 구성 요소로 실질적으로 전달해야할 정보들이 들어가있다.
Secret Key :

const jwt = require("jsonwebtoken");
const payLoad = { foo: "bar" };
const secretKey = "mySecretKey";

const jwtToken = jwt.sign(payLoad, secretKey);
console.log(jwtToken);

//===> Token 생성 완료

const decoded = jwt.verify(jwtToken, secretKey);
console.log(decoded);
//===> Token 검증 완료
profile
Korean-Arabic Translator, Backend Developer

0개의 댓글