스파르타 Node.js 숙련 3 (미들 웨어 (Validation Check))

병아리의최후·2022년 12월 20일
0

Node.js

목록 보기
8/13

01. 미들웨어

1. 미들웨어의 기본개념

  • 미들웨어란 무엇일까?

웹서버에서 요청받을 때 공통적인 처리가 하고싶을 때 사용한다.

  • Express.js 에도 존재한다.
app.use(express.urlencoded({ extended: false }));
app.use(express.json());
  1. urlencoded: form-urlencoded 라는 규격의 body 데이터를 손쉽게 코드에서 사용할 수 있게 도와주는 미들웨어
  2. json: JSON 이라는 규격의 body 데이터를 손쉽게 코드에서 사용할 수 있게 도와주는 미들웨어

이외에도 다양하게 존재하지만 이번에는 이것만 사용해보자.

2. Express.js에서의 미들웨어 작성

미들웨어는 아래의 인터페이스로 작성 가능하다.

app.use((req, res, next) => {
  // 필요한 코드
});

req, res, next는 각자 역할을 지니고 있는 인자(Parameter)

  • req: 요청(Request)에 대한 정보가 담겨있는 객체.
    • HTTP Headers, Query Parameters, URL 등 브라우저가 서버로 보내는 정보들이 담겨있다.
  • res: 응답(Response)을 위한 기능이 제공된다.
    • 어떤 HTTP Status Code로 응답 할지, 어떤 데이터 형식으로 응답 할지, 헤더는 어떤 값을 넣어 응답 할지 다양한 기능을 제공.
  • next: 다음 스택으로 정의된 미들웨어를 호출.

Request로그 남기는 미들웨어 작성

app.use((req, res, next) => {
    console.log('Request URL:', req.originalUrl, ' - ', new Date());
    next();
});

여러개의 미들웨어가 겹칠 때는 어떻게 동작할까?

이때는 첫번째 미들웨어부터 순차적으로 진입한다.

app.use((req, res, next) => {
    console.log('첫번째 미들웨어');
    next();
});

app.use((req, res, next) => {
    console.log('두번째 미들웨어');
    next();
});

app.use((req, res, next) => {
    console.log('세번째 미들웨어');
    next();
});

// print: 첫번째 미들웨어
// print: 두번째 미들웨어
// print: 세번째 미들웨어

next()가 없으면 다음 미들웨어는 실행되지 않는다.

02. 로그인 기능 구현하기

먼저 필요한 모듈을 설치해주자

npm init -y
npm i express mongoose jsonwebtoken -S

그 다음, 구현해둔 프론트엔드 파일을 적용하고 시작!

app.js 시작코드

User 모델

연결이 잘 됐나 확인!

03. 회원가입 API 구현하기

POST 메서드, /users 경로로 요청 받을수 있도록 구현해보자!

먼저 회원가입 할 때 프론트앤드로부터 입력받을 데이터는 4가지

nickname, email, password, confirmPassword 이다.

하지만 패스워드를 그대로 저장하는 것은 보안에 매우 좋지않다.

04. 로그인 API 구현하기

POST 메서드, /auth 경로로 요청 받을수 있도록 구현

이메일, 패스워드 값을 입력받아 데이터베이스에 있는 정보중 이메일 및 패스워드가 일치하면 로그인이 성공

경로가 /auth인 이유는
1. Authenticate를 줄인 단어인데, 로그인 한다는 행위 자체를 "사용자가 자신의 정보를 인증한다" 라고 보기 때문에 일반적으로 로그인에 자주 사용되는 경로 중 하나
2. 프론트앤드 파일에서 이미 이 주소로 데이터를 보내도록 구현했기 때문에

로그인 정보가 틀렸을 때

로그인 성공 시

05. 사용자 인증 미들웨어 구현하기

지금 구현된 프론트엔드는 로그인이 성공했을때 받아온 토큰을 HTTP header에 아래와 같이 넣어서 보내고 있다.

Authorization: **Bearer** JWT토큰내용

위와 같은 양식으로 보내는 이유는 HTTP 인증 유형중, Bearer 타입을 사용하여 토큰을 전달하기 위함.

"Authorization" 헤더로 전달받는 토큰이 유효한지 검사하고, 만약 유효하다면 토큰 안에 있는 userId 데이터로 해당 사용자가 데이터베이스에 실제로 존재하는지 체크하자.

app.js 연결

middleware.js에서

try-catch 해주자

res.locals.user = user 는 무슨 코드일까?

토큰에 담긴 userId로 해당 사용자의 정보를 데이터베이스에서 가져왔다.

이 미들웨어를 사용하는 라우터에서는 굳이 데이터베이스에서 사용자 정보를 가져오지
않게 할 수 있도록 express가 제공하는 안전한 변수에 담아두고 언제나 꺼내서 사용할 수 있게 작성

06. 내 정보 조회 API 구현

GET 메서드, /users/me 경로로 요청 받을수 있도록 구현해보자

app.js

로그인 했을 시

0개의 댓글

관련 채용 정보