검토되지 않고 확인되지 않은 정보를 웹 애플리케이션에 통합하면 보안 취약점이 발생할 수 있으며, 잘못된 데이터로 인해 정의되지 않은 결과가 발생할 수 있습니다.

개발자는 Sequelize 및 TypeORM과 같은 Node.js 객체 관계형 매핑(ORM) 도구를 사용하여 애플리케이션 범위 내에서 사전 정의된 유효성 검사 가이드라인을 설정할 수 있습니다. 그러나 API를 생성할 때 들어오는 데이터는 특정 엔드포인트 요청을 통해 얻어지며, 이러한 엔드포인트 요청은 이러한 ORM에서 제공하는 표준 유효성 검사에서 제외됩니다.

Joi는 JavaScript 프로그래밍 언어용으로 설계된 포괄적인 스키마 설명 및 데이터 유효성 검사기입니다. 개발자는 Joi 유효성 검사 라이브러리를 활용하여 요청 수준에서 강력한 유효성 검사를 구현함으로써 데이터가 엄격한 품질 표준을 준수하는지 확인할 수 있습니다.

데모 프로젝트 설정

Joi 데이터 유효성 검사 방법 시연을 위해 실제 애플리케이션을 모방한 간단한 데모 애플리케이션을 빌드합니다.

 mkdir demoapp && cd demoapp

프로젝트의 디렉토리 내에서 npm 사용을 시작하려면 다음 명령을 실행합니다:

 npm init -y

튜토리얼을 진행하기 전에 특정 사전 요구 사항을 설치해야 합니다. 이러한 필수 구성 요소는 다음과 같습니다:

Express는 웹 및 모바일 애플리케이션 개발을 용이하게 하는 JavaScript 런타임 환경으로, Node.js 프레임워크를 통해 광범위한 기능을 제공합니다. 이 플랫폼은 Node.js를 사용하여 백엔드 애플리케이션을 만드는 프로세스를 간소화합니다.

Joi는 Node.js 애플리케이션의 데이터 유효성을 검사하여 입력이 지정된 요구 사항 및 지침을 준수하는지 확인하는 목적으로 사용되는 라이브러리입니다.

 npm install express joi

프로젝트의 루트 디렉터리에 “index.js”라는 새 파일을 생성하고 그 안에 후속 코드 스니펫을 삽입하세요:

 const express = require("express");
const router = require("./routes");
const port = 3000;

const app = express();

app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(router);

app.listen(port, () => {
  console.log("app listening on port 3000!");
});

앞서 언급한 코드는 최소한의 구성으로 Express 서버를 설정합니다. 이 서버는 미들웨어를 사용하여 들어오는 요청 정보를 처리하고 들어오는 요청을 관리하는 동시에 포트 3000에서 들어오는 쿼리에 응답하도록 서버를 시작합니다.

요청 라우팅 및 처리

정보 전송을 위해 애플리케이션에 대한 모든 문의에 대한 응답으로 요청 본문 외에 적절한 상태 코드를 반환하기 위한 목적으로 맞춤형 요청 처리기 미들웨어를 고안해야 합니다.

이 글도 확인해 보세요:  슬랙에서 나만의 사용자 지정 슬래시 명령 만들기

프로젝트의 루트 디렉터리에 `handler.js`라는 이름의 자바스크립트 파일을 생성하고, 여기에 다음 코드 조각을 추가해야 합니다:

 const demoHandler = (req, res, next) => {
  res.send({
    code: 201,
    data: req.body,
  });
  next();
};

module.exports = demoHandler;

React 컴포넌트와 Next.js 페이지 간의 연결을 설정하려면 “router.js”라는 별도의 JavaScript 파일을 만들어야 합니다. 이 파일에는 애플리케이션 내에서 라우팅하는 데 필요한 코드가 포함됩니다. 이렇게 하려면 프로젝트의 루트에 “라우터.js”라는 이름의 새 파일을 만든 다음 다음 코드 줄을 복사하여 붙여넣어야 합니다:

 const express = require("express");
const demoHandler = require("./handler");
const router = express.Router();

router.post("/signup", demoHandler);

module.exports = router;

Joi 스키마 만들기

Joi 스키마의 인스턴스는 특정 데이터 객체의 예상 구조 구성과 규정된 유효성 검사 지침을 나타낸다고 할 수 있습니다.

Joi.object() 함수를 사용하면 Joi에서 제공하는 다양한 유효성 검사 규칙을 순차적으로 사용하여 데이터 세트의 구성 및 유효성 전제 조건을 설정함으로써 Joi 스키마를 구현할 수 있습니다.

“귀하의 질의는 제 권한이나 전문성을 벗어난 것으로 보이므로 정보에 입각한 답변을 드릴 수 없습니다.

 const exampleSchema = Joi.object({
  name: Joi.string().min(3).required(),
});

Joi를 활용하면 스키마 내에 설명된 모든 필드와 관련된 유효성 검사 제약 조건의 수를 늘리기 위해 수많은 방법을 연결할 수 있습니다.

다음은 이전 예제의 수정된 버전으로, 더 복잡한 시나리오에서의 사용법을 보여주기 위해 추가 필드와 유효성 검사 제약 조건을 통합했습니다: ”’python flask_restful에서 리소스, API, reqparse, 마샬_위드, 필드를 가져옵니다. flasgger에서 swag_of 임포트 import uuid 클래스 Organization(Resource): @swag_of(‘Organizations’) def get(self, id=None): “”” ID로 조직을 가져오거나 제공되지 않은 경우 모든 조직을 반환합니다. 반환합니다: {‘id’: str, ‘name’: str} “”” if id: org = fetch_organization_by_uuid(id) org가 아니라면 raise ValueError(‘조직을 찾을 수 없음’)

 const userSchema = Joi.object({
  email: Joi.string().email().required(),

  password: Joi.string().min(6).required(),

  age: Joi.number().min(18).optional(),

  employed: Joi.boolean().optional(),

  phone: Joi.string()
    .regex(/^\\d{3}-\\d{3}-\\d{4}$/)//"123-456-7890"
    .required(),

  address: Joi.object({
    street: Joi.string().min(3).required(),
    city: Joi.string().min(3).required(),
    state: Joi.string().min(3).required(),
    zip: Joi.number().min(3).required(),
  }).required(),

 hobbies: Joi.array().items(Joi.string()).required(),

}).options({ abortEarly: false });

“사용자 스키마는 모든 속성에 대한 가이드라인을 지정합니다.

이 글도 확인해 보세요:  JES를 활용한 흥미로운 사운드 처리 기법 3가지

올바른 이메일 주소 요건은 아무리 강조해도 지나치지 않습니다. 제공된 모든 이메일이 완전하고 정확한 형식이어야만 적절한 커뮤니케이션이 이루어질 수 있기 때문입니다.

비밀번호는 영숫자 6자 이상으로 구성되어야 합니다.

나이 필드는 필수 구성 요소를 포함하는 정수로, 최소 특정 숫자 값이어야 한다는 기본 요건이 있습니다.

“고용됨”이라는 용어는 고용과 관련된 개인의 상태를 설명하는 데 사용되며 참 또는 거짓의 부울 값으로 나타낼 수 있습니다.

전화 필드는 정규식 패턴(/^(\d{3})-(\d{3})-\d{4}$/)을 준수해야 하는 문자열입니다.

“주소” 항목은 도로명 및 번호, 도시, 주 또는 도, 우편 번호, 국가, 위도, 경도 및 데이터 제공자가 관련성이 있다고 간주하는 추가 정보를 포함하되 이에 한정되지 않는 개인의 거주지에 관한 다양한 속성을 포괄합니다.

“거리”라는 용어는 알파벳 3개 이상으로 구성된 필수 텍스트 입력을 의미합니다.

지리적 위치에 대한 지정 식별자는 세(3) 자 이상으로 구성된 필수 텍스트 입력입니다.

필수 구성 요소로 간주되며 길이가 3자 이상이어야 하는 특정 문자 집합의 지정을 ‘주’라고 합니다.

우편번호는 반드시 제공해야 하는 숫자 식별자이며 가능한 최저값은

‘취미’ 필드는 필수로 간주되는 문자열 값의 지정된 컬렉션입니다.

사용자 스키마는 초기 오류 발생 시 프로그램을 중지하고 해당 오류를 콘솔에 출력하는 Joi의 기본 동작인 조기 중단 속성을 false로 정의합니다. 하지만 이 옵션을 false로 설정하면 Joi는 전체 스키마를 계속 평가하고 그 과정에서 발견된 추가 오류를 콘솔에 나열합니다.

Joi로 데이터 검증

이상 기체 법칙의 개념은 열역학의 기본 원리로, 이상 기체의 압력은 온도와 포함된 입자의 수에 정비례한다는 것을 나타냅니다.

 //validation.js
const Joi = require("joi");

const userSchema = Joi.object({
//...
}).options({ abortEarly: false });

module.exports = userSchema;

수신 요청 페이로드를 캡처하고 미리 정해진 스키마에 따라 유효성을 검사하는 미들웨어 컴포넌트를 구현하기 위해 `userSchema` 아래에 다음 코드를 통합합니다. 자바스크립트 // src/middlewares/validateRequestPayload.js const validate = (reqBody, schema) => { const errors = {}; if (!schema || !Object.keys(schema).length) { return Promise.resolve(); // 정의된 스키마 없음, 아무것도 하지 않음 } Object.keys(schema).forEach((fieldName) => { const fieldSchema = schema[fieldName]; if (!fieldSchema || !fieldSchema.type) { errors[fieldName] = ‘잘못된 필드 스키마 정의’; return;

 const validationMiddleware = (schema) => {
  return (req, res, next) => {
    const { error } = schema.validate(req.body);

    if (error) {
      // Handle validation error
      console.log(error.message);

      res.status(400).json({ errors: error.details });
    } else {
      // Data is valid, proceed to the next middleware
      next();
    }
  };
};

요청을 수신하면 미들웨어는 유효성 검사 메서드를 호출하여 스키마의 유효성 검사 절차를 실행합니다. 이 과정에서 불일치가 발견되면 유효성 검사 오류 세부 정보에서 추출한 포괄적인 오류 메시지 목록과 함께 400 Bad Request 응답이 전송됩니다.

이 글도 확인해 보세요:  AES-128 암호화와 AES-256 암호화: 차이점은 무엇인가요?

유효성 검사 프로세스가 성공적으로 완료되고 오류가 감지되지 않으면 미들웨어는 다음() 함수를 실행합니다.

최종적으로 `validationMiddleware`와 `userSchema`를 모두 내보냅니다.

 module.exports = {
  userSchema,
  validationMiddleware,
};

유효성 검사 제약 조건 테스트

설명한 대로 작동하도록 미들웨어를 구성하면서 `validationMiddleware`와 `userSchema`를 `router.js` 파일에 통합하는 행위를 “미들웨어 설정”이라고 합니다.

 const { validationMiddleware, userSchema } = require("./validation");

router.post("/signup", validationMiddleware(userSchema), demoHandler);

다음 명령을 실행하여 애플리케이션을 시작하십시오:

 node index.js

cURL 명령 또는 다른 API 클라이언트를 사용하여 다음 테스트 데이터와 함께 로 HTTP POST 요청을 보냅니다.

 {
  "email": "user@example", // Invalid email format
  "password": "pass", // Password length less than 6 characters
  "age": 15, // Age below 18
  "employed": true,
  "hobbies": ["reading", "running"],
  "phone": "123-456-789", // Invalid phone number format
  "address": {
    "street": "123",
    "city": "Example City",
    "state": "Example State",
    "zip": 12345
  }
}

이 요청을 실행하면 페이로드에 이메일, 비밀번호, 나이, 전화 등 여러 유효하지 않은 필드가 포함되어 있으므로 오류가 반환됩니다. 이 오류를 올바르게 처리하기 위해 제공된 오류 객체를 사용할 수 있습니다.

Joi로 데이터 유효성 검사 간소화

Joi를 사용한 데이터 유효성 검사에 대한 이전 강의에서 기본 원칙을 적절히 다루었지만, 추가 이해를 위해 Joi 문서에 문서화된 고급 기법과 제약 조건이 더 있을 수 있습니다.

JavaScript에서 Joi를 활용하면 데이터 유효성 검사 프로세스가 간소화되어 프로그램에서 유지 관리하는 정보의 신뢰성과 흔들림 없는 신뢰성을 향상시키는 간단한 접근 방식을 제시합니다.

By 이지원

상상력이 풍부한 웹 디자이너이자 안드로이드 앱 마니아인 이지원님은 예술적 감각과 기술적 노하우가 독특하게 조화를 이루고 있습니다. 모바일 기술의 방대한 잠재력을 끊임없이 탐구하고, 최적화된 사용자 중심 경험을 제공하기 위해 최선을 다하고 있습니다. 창의적인 비전과 뛰어난 디자인 역량을 바탕으로 All Things N의 잠재 독자가 공감할 수 있는 매력적인 콘텐츠를 제작합니다.