본문 바로가기
웹 개발

33. Express 리팩토링 & 유효성 검증

by 곽정우 2024. 4. 24.

1. 리팩토링

  • 소프트웨어 개발 과정에서 코드를 재구성하여 가독성을 높이고 유지보수를 쉽게 만드는 과정
  • 코드의 구조를 개선하고 중복을 제거하여 더 나은 설계 패턴을 도입함으로 코드의 품질을 향상
  • 코드의 기능을 변경하지 않으면서 코드를 개선하는 방법
express-validator
Express.js를 사용하여 웹 어플리케이션을 개발할 때 입력 데이터의 유효성을 검사하기 위한 패키지

설치
npm i express-validator
isLength(): 문자열 길이 검증

    app.get('/:email', [param('email').isLength({min:3}).withMessage('이메일을 입력하세요'), validate], (req, res, next) => {
        res.send('📧')
    });
// 확인이 필요(잘 작동 안함)
isEmail(): 이메일 주소의 유효성 검즘

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

 

isInt(): 숫자의 최소 또는 최대값 검증

    app.get('/:num', [param('num').isInt({min:10, max:100}).withMessage('숫자의 범위를 10이상 100이하로 입력하세요'), validate], (req, res, next) => {
        res.send('📧')
    });
matches(): 정규표현식을 사용하여 문자열의 패턴을 검증

    app.get('/:name', [param('name').matchs(/^[가-힣]+$/).withMessage('이름은 한글로 입력하세요'), validate], (req, res, next) => {
        res.send('📧')
    });

 

2. 회원 정보 확인

회원가입, 로그인(회원정보 확인, 아이디를 보내면 해당 객체의 정보만 출력) 

    users = [
        {
            ....
        }
    ]


Authentication(인증)

1. cookie  & session 

cookie  

  • 클라이언트 컴퓨터에 저장되는 작은 데이터 조각
  • 서버로 부터 전소오디어 클라이언트 웹 브라우저에 저장
  • 텍스트 형식으로 주로 사용자 인증, 설정, 장바구니 등에 사용

session 

  • 웹 서버 측에서 유지되는 상태 정보
  • 사용자에 대한 고유한 세션ID를 통해 식별
  • 서버 메모리 또는 데이터베이스에 저장할 수 있음

2. JWT(JSON Web Token)

  • 웹 애플리케이션과 서비스 간에 정보를 안전하게 전달하기 위한 인증 및 권한 부여 매커니즘을 구현하는 데 사용되는 표준화된 방법 중 하나
  • JSON 포맷을 사용하여 정보를 표현하고 서명 및 암호화를 통해 정보의 무결성을 보장
{ Header | Payload | Signature }

 

Header: 토큰 유형 및 서명 알고리즘과 같은 메타테이터가 포함

Payload: 토큰에 포함될 데이터가 들어있는 부분

Signature: 헤더, 페이로드 및 비밀 키를 사용하여 생성된 서명을 토큰의 무결성을 검증하는데 사용

3. bcrypt

  • 해시 함수를 사용하여 비밀번호를 안전하게 저장하는 데 사용되는 암호화 라이브러리
  • 단반향 해시 함수로 한 번 해시된 값을 다시 원래 값으로 역추적하는 것이 불가능
  • 솔트(salt): 해시에 고유한 솔트 값을 추가하여 보안성을 높임. 같은 비밀번호를 가진 사용자가 있더라도 서로 다른 해시값을 가짐
  • 작업인자(Adaptive Work Factor): 매개변수를 조정하여 해시 작업의 복잡성을 조절. 암호 분석학적으로 안전한 해시 함수를 유지하면서도 암호화 작업에 필요한 시간을 조절할 수 있게 함

✔ 해시 함수

임의의 길이의 데이터를 받아서 고정된 길이의 고유한 값으로 변환하는 함수. 이러한 변환된 값은 해시 값 또는 해시 코드라고 함

  • 동일한 입력에 대해 항상 동일한 해시 값을 생성
  • 고덩죈 출력 길이를 생성
  • 해시된 값을 통해 원본 값을 복구할 수 없음

4.jsonwebtoken

  • 웹 애플리케이션에서 인증 및 정보 교환을 위한 토큰 기반의 인증 방식 중 하나
  • base64로 인코딩된 json 객체이며 사용자 정보 및 기타 데이터를 안전하게 전송하기 위해 사용
  • header: jwt의 유형과 해싱 알고리즘이 포함
    {
        "alg":"hs256",
        "typ":"jwt"
    }
- patload: 토큰에 담길 정보가 포함
    {
         id: 'apple',
        isAdmin: false
    }
  • signature: 헤더와 페이로드를 인코딩하고 비밀 키를 사용하여 서명된 문자열, 서명은 토큰이 변조되지 않았음을 확인하는데 사용

sign()

  • jsonwebtoken.sign(payload, secretOrPrivatekey,[options,callback])
  • payload: jwt에 포함될 페이로드 데이터
  • secretOrPrivatekey: jwt 서명하기 위해 사용될 비밀 키 또는 개인 키