[Toy Project - Omuk] 12. 로그인-로그아웃 확인 미들웨어 및 템플릿 엔진 응용

2022. 9. 12. 13:59· Node.js/Express.js
목차
  1. 권한 미들웨어
  2. 서버 사이드 렌더링

권한 미들웨어

로그인을 하려고 할 때, 이미 로그인 된 상태라면 다시 로그인 할 필요가 없습니다. 마찬가지로 회원가입도 필요가 없습니다. 그렇기 때문에 로그아웃이 된 상태에서만 요청이 가능하도록 구현해야 합니다. 반대로, 로그인한 상태여야 로그아웃을 할 수 있도록 해야 합니다.

 

그래서 이러한 조건을 충족시키기 위해서 권한이 있는지 없는지 체크할 필요가 있습니다. 그래서 해당 라우트로 특정 요청이 들어올 때 미들웨어를 거치도록 합니다.

 

루드 디렉터리에서 middlewares 폴더를 생성하고 그 폴더에서 authCheck.js 파일을 만듭니다. 그리고 두 가지 미들웨어를 export 해줍니다.

 

export function isLoggedIn(req, res, next) {
	if (req.isAuthenticated()) {
    	next();
    } else {
    	res.status(403).send("로그인이 필요합니다");
    }
}

export function isNotLoggedIn(req, res, next) {
	if (!req.isAuthenticated()) {
    	next();
    } else {
    	const message = encodeURIComponent("로그인 한 상태입니다");
    	res.redirect(`/?error=${message}`);
    }
}

이제 로그인, 회원가입 라우터와 로그아웃 라우터에 해당 미들웨어를 넣어줍니다.

로그아웃 컨트롤러는 아래와 같이 구현하였습니다. 기존의 방법에서 조금 변경된 내용이 있습니다.

/** 로그아웃 */
const logOut = (req, res) => {
  req.logout((err) => {
    req.session.destroy();
    if (err) return next(err);
    else res.redirect("/");
  });
};

서버 사이드 렌더링

passport를 통해서 구현한 로그인, 로그아웃을 통해서 세션을 redis에 저장하여 클라이언트가 인증에 성공할시 세션값을 부여하도록 사용했습니다.

 

이제 사용자의 세션에 저장된 값을 이용하여 요청 객체에 저장하고 라우터에서 그 객체를 사용할 수 있게 되는 것입니다. 이를 적절히 활용해서 템플릿 엔진에서도 사용해보도록 하겠습니다.

 

일단, passport의 deserializeUser를 통해서 req.user에 저장되는 정보를 res.locals.user에 저장해주도록 합시다. 일단 로그인된 후에 루트 디렉터리로 리다이렉트될 때 res.locals.user에 정보가 저장되어 뷰 엔진에서 user 객체를 사용할 수 있게 됩니다.

 

일단 user 객체를 사용하기 위해 미들웨어를 설정합니다.

router.use((req, res, next) => {
    res.locals.user = req.user;
    next();
});

이제 뷰엔진에서 해당 정보를 사용하려고 합니다. 저는 로그인했을 때, 로그인/회원가입 버튼이 보이지 않도록 설정했습니다.

 

<div id="sign">
    {{#if user}}
        <div class="sign auth">
            <div class="user">{{user.dataValues.nickname}}님 안녕하세요.</div>
            <a href="/auth/logout">로그아웃</a>
        </div>
    {{else}}
        <div class="sign body">
        	<a href="/auth/signin">로그인/회원가입</a>
        </div>
    {{/if}}
</div>

user 객체가 있으면 로그인이 된 것이기 때문에 핸들바의 if 조건문을 사용했습니다. 로그인한 상태일 때는 로그아웃 버튼과 유저에 대한 인사를, 로그아웃-로그인하지 않은 상태일 때는 로그인/회원가입 버튼을 구현했습니다.

 

서버를 시작하여 테스트해보겠습니다. 카카오로 로그인했을 때의 화면입니다.

로그아웃 버튼을 누르면 아래와 같이 다시 로그인/회원가입 버튼으로 바뀝니다.

로컬 로그인에서도 동일하게 작동합니다.

저작자표시 비영리 (새창열림)

'Node.js > Express.js' 카테고리의 다른 글

[Toy Project - Omuk] 14. AWS 배포(EC2 - VScode 연결)  (2) 2022.09.15
[Toy Project - Omuk] 13. 배포 환경 설정  (0) 2022.09.14
[Toy Project - Omuk] 11. 카카오 로그인 API를 통한 로그인 구현  (0) 2022.09.09
[Toy Project - Omuk] 10. 사용자 인증(Redis, Passport, Express)  (0) 2022.09.06
[Toy Project - Omuk] 9. 컨트롤러 분류  (0) 2022.09.05
  1. 권한 미들웨어
  2. 서버 사이드 렌더링
'Node.js/Express.js' 카테고리의 다른 글
  • [Toy Project - Omuk] 14. AWS 배포(EC2 - VScode 연결)
  • [Toy Project - Omuk] 13. 배포 환경 설정
  • [Toy Project - Omuk] 11. 카카오 로그인 API를 통한 로그인 구현
  • [Toy Project - Omuk] 10. 사용자 인증(Redis, Passport, Express)
턴태
턴태
import { Dream } from "future";
턴태
턴태의 밑바닥부터 시작하는 de-vlog
턴태
전체
오늘
어제
  • ROOT (187)
    • Node.js (37)
      • ES6 (1)
      • TypeScript (3)
      • Express.js (16)
      • NestJS (16)
      • JS (24)
    • 프론트엔드 (29)
      • CS (5)
    • 백엔드 (1)
      • 검색 (2)
      • Database (1)
    • 기타 툴 (1)
      • git (1)
    • 데브옵스 & 인프라 (19)
      • Kubernetes (15)
      • Docker (2)
      • Monitoring (1)
      • IaC (1)
    • Algorithm (90)
      • Implementation & simulation (5)
      • Math (4)
      • Brute Force (1)
      • String (0)
      • Graph (5)
      • Recursion & Backtracking (19)
      • Divide & Conquer (2)
      • Dynamic Programming (18)
      • Greedy (13)
      • Priority Queue (2)
      • Binary Search (6)
      • Data Structure (7)
      • Shortest Path (5)
      • Minimum Spanning Tree (1)
      • Sorting (1)
      • Prefix Sum (1)
    • Linux (1)
      • Ubuntu (1)
    • Diary (5)
      • Algorithm (1)
      • Conference (1)
      • Retrospective (3)
    • Book (0)
      • Self-Development (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 타입스크립트
  • backtracking
  • 인프런
  • 토이프로젝트
  • 오먹
  • 노드
  • 익스프레스
  • 인프런X디프만
  • Express
  • dynamic programming
  • 백트래킹
  • N과 M
  • GREEDY
  • nestjs
  • TypeScript
  • Kubernetes
  • 백준
  • 파이썬
  • 함수형 프로그래밍
  • k8s
  • 쿠버네티스
  • node.js
  • 네스트
  • Omuk
  • Toy Project
  • python
  • baekjoon
  • 자바스크립트
  • 다이나믹 프로그래밍
  • 디프만

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.1
턴태
[Toy Project - Omuk] 12. 로그인-로그아웃 확인 미들웨어 및 템플릿 엔진 응용
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.