Node.JS + Express + mongoDB Tutorial 인증 / 인가 미들웨어 구현하기

인증 / 인가 튜토리얼(3/3)

Jun
4 min readAug 23, 2020

본 글은 Node.JS + Express + MongoDB(Mongoose) 를 사용한 튜토리얼 입니다.

로그인을 다룬 이전 글에서 이어지는 글 입니다.

인증 / 인가 미들웨어 구현하기

이전 글에서 로그인에 성공 했을 시(이메일과, 암호화된 비밀번호가 같은 경우) 토큰을 발행해서 유저의 브라우저로 응답(객체)에 담아 보냈다.

다시 한 번 짚어보자면, http 요청과 응답은 stateless 이기 때문에, 이전의 요청과 응답에 대한 정보가 없다. 그렇다고 해서 유저의 접근권한이 필요한 기능을 위해서 매 번 로그인을 시킬 수 없다. 따라서, 유저가 최초에 로그인 성공시에 토큰을 발급해서 보낸다. 이 토큰은 유저의 정보가 필요한 모든 기능(my page, 장바구니, 찜하기 등등..)에서 사용된다.

간단한 fetch 함수로 예를들자면 다음과 같다.

유저의 브라우저에서 돌아가는 프론트엔드 코드는 우리가 개발하는 백엔드 서버의 API에 요청을 보낼 때 마다 위의 코드 처럼 헤더 객체의 인증/인가를 나타내는 Authroization 의 키값에 토큰을 담아서 보낸다.

이 부분이 바로 미들웨어가 필요한 부분이다. 웹앱을 구성하다 보면 많은 정보는 유저의 권환이 있어야만 접근 가능하다. 많은 정보라 함은 그만큼 많은 기능이 구현되어야 한다는 뜻이고, 기능은 하나의 API라고 이야기 할 수 있다. 즉 수많은 기능에는 위의 코드처럼 요청에 담아 보내는 토큰이 유효한지 아닌지를 그 여부를 가리는 코드가 들어가야 한다.

미들웨어의 필요성

그렇다면, 모든 기능의 앞단의 코드에 인증/인가 유효 여부를 가리는 코드가 들어가야 할까? 맞다. 근데 너무 많은 기능에 이 코드를 집어 넣게 되면 수없이 많은 코드가 반복되어질 것이다. 따라서 미들웨어로 분리해야 한다. 미들웨어의 개념은 생각보다 간단하다. 거쳐가는 곳이라고 생각하면 편하다.

  • 내가 담은 장바구니의 정보를 보기 위해서 인증/인가 미들웨어를 거쳐간다.
  • 장바구니에 다른 상품을 추가하기 위해서 인증/인가 미들웨어를 거쳐간다.
  • 다른 유저의 게시물에 좋아요를 누르기 위해서 인증/인가 미들웨어를 거쳐간다. . . . 끝도 없이 많은 유저의 권한을 필요로 하는 기능들은 항상 인증/인가 미들웨어를 거쳐간다.

따라서, 인증/인가를 하는 코드를 따로 함수로 구현하고, 우리가 앞서 라우터에 미들웨어를 연결시켜 준 것 처럼 함수를 연결시켜 주면 된다.

isAuth 미들웨어(함수) 구현하기

상단의 코드의 주석에 한줄 한줄 주석을 달아 놓았지만 미들웨어의 핵심이 되는 것은 단연코 함수의 인자로 들어오는 세가지 객체다.

  1. req: request 객체. 유저가 보낸 요청의 모든 정보가 이 객체에 담겨있는다. express의 use 함수로 연결시켜주는 모든 미들웨어의 첫번째인자로는 항상 이 request 객체가 들어온다.
  2. res: response 객체. 미들웨어는 request 객체와 마찬가지로 우리가 유저에게 보낼 응답 객체를 계속해서 계승한다.
  3. next: next 함수다. 이 함수를 실행시키면, express 의 use 함수로 연결시켜준 다음 미들웨어로 상단의 두 객체가(맥락이) 넘어간다.

따라서, 유저의 인증을 마치고, 다음 기능(장바구니 정보 가져오기, 담기 등..)을 실행하기 위해서는 그 미들웨어로 현재의 맥락(req, res 객체들)을 보내줘야 한다. 이 때 사용되는 함수가 바로 next() 함수다.

미들웨어 연결하기

장바구니 기능을 구현한 cart API 를 구현했다고 가정해보자. 다음의 코드와 같이 본래 라우팅을 할 때 해당하는 주소에 미들웨어를 연결시켜 주는 것과는 다르게, 중간에 isAuth 를 거쳐 가도록 함수만 넣어주면 된다.

거쳐가도록 하게 하는 것이 그저 우리가 구현한 isAuth 함수를 연결시켜 주면된다. 미들웨어의 연결은 생각보다 간단하다. 미들웨어는 거쳐가는 것이고, 거쳐가게 하기 위해서 중간에 구현한 함수를 넣어주기만 하면 된다. 이 미들웨어는 한개고 두개고 무한대로 작성해서 거쳐가도록 할 수 있다.

routes/cart.js

--

--

No responses yet