비밀번호 암호화 하는 이유

DB에 나의 비밀번호가 암호화 하지 않고 그대로 저장을 하게 되면,

해커가 DB를 통해서 나의 비밀번호를 알게 되고 나의 계정을 마음대로 사용할 수 있게 되버린다.

이를 막기위해서 비밀번호를 암호화를 한다.

 

비밀번호 암호화의 종류

  • 양방향 암호화: 암호화된 데이터에 대한 디코딩(decoding)이 가능한 암호화 방식.
    (ex)
    대칭키, 공개키 <자세한건 나중에 정리>
    • 디코딩 : 부호화(encoding)된 암호를 부호화 되전의 상태로 돌려 사람들이 읽을 수 있도록 하는 것
  • 단방향 암호화 : 암호화된 데이터에 대한 디코딩이 불가능한 암호화 방식.
    (ex)
    Hash, MAC <자세한건 나중에 정리>

비밀번호 암호화하는 과정 ( 단방향 암호화방식)

설치 및 생성

// express 프로젝트 생성
npm i init
npm i express

// 암호화 라이브러리 설치
npm i bcrypt

* bcrypt:  hash 방식으로 암호화하는 것을 도와주는 라이블러리,  password-hashing function

hasing 이란 → 주어진 값을 다른 값으로 변형시키는 것이다. 이때  사용되는 수학적 알고리즘에 따라 변형된 값이 생성된다. 

코드 예시

const express = require('express');
const bcrypt = require('bcrypt');

const app = express();
app.use(express.json());
const port = 3000;

const users = [];

// 회원가입
app.post('/sign-up', async (req, res) => {
  const { username, password } = req.body;

  // 비밀번호 해시화
  const saltRounds = 10; // salt: 설정한 password를 복잡하게 변경시키는 것, 이것을 10번 실행
  const hashedPassword = await bcrypt.hash(password, saltRounds);

  // 임시로 사용자 정보 저장
  const newUser = {
    username: username,
    password: hashedPassword,
  };
  users.push(newUser);

  return res.status(201).send(newUser);
});

// 로그인
app.post('/sign-in', async (req, res) => {
  const { username, password } = req.body;

  // 등록된 사용자인지 확인 
  const user = users.find(user => user.username === username);
  if (!user) {
    return res.status(401).send({ message: '등록되지 않은 사용자입니다.' });
  }

  // 저장된 해시화된 비밀번호와 입력된 비밀번호 비교
  const isPasswordValid = await bcrypt.compare(password, user.password);
  if (!isPasswordValid) {
    return res.status(401).send({ message: '비밀번호가 일치하지 않습니다.' });
  }

  // Access Token 발급 로직으로 교체하기
  return res.status(200).send({ accessToken: "ACCESS_TOKEN" });
});

app.listen(port, () => {
  console.log(`앱이 http://localhost:${port} 에서 실행 중입니다.`);
});

 

 

+ Recent posts