만화에 나오는 문구는 유튜브 '얄팍한 코딩사전'의 얄코님의 설명에서 가져왔다.
인증과 인가는 ‘사용자의 권한을 확인’하는 행위라는 비슷한 의미를 지니지만, 엄밀히 따지면 전혀 다른 정의를 가지고 있다.
서비스의 보안을 위해서는 인증과 인가 모두 적절히 구현해야 한다. 오늘날 널리 통용되는 인증 방식으로는 세션 방식과 토큰 방식이 있다.
세션 객체를 통해 인증을 처리하는 방식이다.

토큰을 이용해 인증을 처리하는 방식이다.
JWT(Json Web Token)는 웹에서 사용되는 JSON 형식의 Claim 기반 웹 토큰에 대한 표준 규격으로, 주로 사용자 인증과 인가 정보를 서버와 클라이언트 간 안전하게 주고 받기 위해서 사용된다. 쿠키와 세션의 단점을 보완하기 위해 등장한 개념이기도 하다.
[헤더].[페이로드].[시그니처]jwt는 기밀성 보장?
jwt는 기밀성을 보장하는 것이 아닌 무결성을 보장하는 것이다. 따라서 세션보다 보안이 뛰어나다고 볼 수는 없다.
Access Token & Refresh Token: JWT의 시그니처로 인해 악의적인 사용자가 토큰의 페이로드를 변조하더라도 이는 웹 서버 측에서 검증할 수 있다. 하지만 토큰 자체를 탈취당한다면 말이 달라진다. 이러한 토큰의 단점을 어느정도 보완하기 위해 나온 개념이 Access Token과 Refresh Token이다.
페이지를 인증(authentication)된 사용자에 한해서만 보여줘야 하는 경우가 있다. 세션 객체 확인을 통해 로그인 정보가 없다면 사용자를 홈 화면과 같이 비인증 사용자도 접근할 수 있는 페이지로 돌려보내게 설계해보았다.
// 로그인 시 사용자 정보를 저장하는 세션(req.session.user)을 부여하는 로직이 존재하여야 함
// 세션 확인 미들웨어 정의
const requireLogin = (req, res, next) => {
if (!req.session.user) {
res.render("index.ejs", { data: { deniedAccess: true } });
} else {
next();
}
};
module.exports = requireLogin;
// 로그인한 사용자들에게만 보이는 게시물 목록
const requireLogin = require("../utils/requireLogin");
router.use("/post/list", requireLogin);