수업 복습/Node.js

11월 3일 수업 내용 - Node.js - Git / Day06

김복칠 2023. 11. 3. 18:39

1. Validation

- 프로젝트 및 코드 유효성 검사

- 코드의 구문 및 논리적 오류를 식별하고 프로젝트 설정 및 환경 검사도 수행할 수 있음

import express from 'express'
import {body,param, validationResult} from 'express-validator'

- 먼저 터미널에서 "express-validator" 와 "express" 를 다운로드 받음

- package.json 에 "express-validator" 와 "express" 이 다운받아 있는지 확인한 후 활용하고자 하는 js 파일에 import 를 설정

- 위의 설정을 통해 "express" 와 " express-validator" 모듈을 활성화 함 

 

const app = express()
app.use(express.json())

- 변수 app 에 express 모듈 생성하고 json 요청 본문을 읽을 수 있도록 설정

 

const validate = (req, res, next) => {
    const errors = validationResult(req);
    if(errors.isEmpty()){
        return next();
    }
    return res.status(400).json({ message: errors.array()[0].msg });
}

- 변수 validate 에 함수를 정의하는데 "validationResult" 를 사용하여 요청되는 값의 유효성을 검사

- 검사 결과가 유효하면 받은 내용을 return 하고 요류 발생 시 오류코드 400과 설정해 놓은 오류 메세지를 응답

app.get('/:email', [
        param('email')
            .isEmail()
            .withMessage('이메일을 입력하세요!'), validate]
            ,(req, res, next) => {res.send(':연애편지:');});

app.post('/users',[
        body('name')
            .trim()
            .isLength({min:2})
            .withMessage('이름은 두글자 이상으로 입력')
        ,body('age')
            .isInt()
            .withMessage('나이는 숫자로 입력')
        ,body('email')
            .isEmail()
            .withMessage('이메일을 입력')
        ,body('job.name')
            .notEmpty(),validate]
        ,(req,res,next)=>{console.log(req.body);res.sendStatus(201)})

app.listen(8080)

- app.get 으로 받아서 postman 으로 확인했을 때 요청받은 "email" 의 값이 위의 검사에서 유효하다면 받은 내용을 그대로 return

- 유효하지 않을시 ".withMessage" 를 송출

- 마찬가지로 app.post 로 받아서 postman 으로 확인했을 때 요청받은 "name", "age", "email", "jop.name" 의 값이 위의 검사에서 유효하다면 받은 내용을 그대로 return

- 유효하지 않을시 ".withMessage" 를 송출

 

2. Bcrypt

- 비밀번호 해싱과 비밀번호 검증을 수행하기 위한 라이브러리

- 비밀번호 보안을 향상시키고 사용자 데이터를 안전하게 저장하는 데 사용

const bcrypt = require('bcrypt')
	or
import bcrypt from bcrypt

- 먼저 터미널에서 " bcrypt " 를 다운로드 받음

- 변수에 require 을 설정해 주거나 import 를 설정해서 사용

 

const password = 'abcd1234'
const hashed = bcrypt.hashSync(password,10) // password 뒤의 숫자는 암호화의 레벨, 대게 8~12 를 사용
console.log(`password:${password},hashed:${hashed}`);

// abcd1234
// $2b$10$nikn8UZqfee8u0wgZAqj3e9HTElNvH5ckI6OSlyabmKF0niu9OXS.

- 먼저 변수에 임의로 비밀번호를 입력해주고 hashSync 함수를 이용해서 비밀번호를 암호화 처리

- abcd1234 의 암호화 결과값으로 변환

 

const result = bcrypt.compareSync('abcd1234',hashed)
console.log(result);

- 암호화된 비밀번호는 compareSync 함수로 해석가능 

- hashSync , compareSync 함수 모두 동기화 된 함수 이며 비동기화 상태에서 이용하게 되면 await ~~ hash, await ~~ compare 로 사용 가능

 

3. JWT (JSON Web Token)

- 웹 애플리케이션과 서비스 간에 정보를 안전하게 전달하기 위한 인증 및 권한 부여 매커니즘을 구현하는 데 사용되는 표준화된 방법 중 하나

- JSON 포멧을 사용하여 정보를 표현하며, 서명 및 암호화를 통해 정보의 무결성을 보장

  • { Header    |   Payload     |   Signature  }
  • Header : 토큰 유형 및 서명 알고리즘과 같은 메타데이터가 포함
  • Payload : 토큰에 포함될 데이터가 들어있는 부분
  • Signature : 헤더, 페이로드 및 비밀 키를 사용하여 생성된 서명으로 토큰의 무결성을 검증하는 데 사용
const jwt = require('jsonwebtoken')

const secret = 'abcdefg1234%^&*'
const token = jwt.sign(
    {
        id:"apple",
        isAdmin:false
    },
    secret,
    { expiresIn: 3 }
)

setTimeout(()=>{
    jwt.verify(token,secret,(error,decodeed)=>{
        console.log(error,decodeed);
    })
}, 2000)

console.log(token);