본문 바로가기
Programming/Node.js

[NodeJS] Passport 기반 인증 처리

by 깐니 2020. 10. 11.

* 전체흐름
Passport 모듈을 이용해서 db에 내용 저장 후, 결과를 받아서 세션을 만들어서 로그인을 한다.

* 사전준비
npm install passport passport-local express-session connect-flash —save -dev

1. passport

(1) passport 란?
passport 는 Node.js의 인증 미들웨어이다.
일반적으로 사용자는 username 과 password를 제공하여 로그인한다.

소셜 네트워킹의 등장으로 OAuth 공급자를 사용한 SSO(single sign on)이 널리 사용되는 인증 방법이 되었다. API를 호출하는 서비스는 액세스를 보호하기 위해 토큰 기반 자격 증명이 필요하다.

Passport는 각 응용 프로그램마다 고유의 인증 요구 사항이 있음을 인식하여 전략(Strategy)로 알려진 인증 메커니즘은 개별 모듈로 패키지된다.

따라서, 응용프로그램은 불필요한 종속성을 만들지 않고 사용할 전략을 선택할 수 있다는 장점이 있다.

(2) Strategy 란?
passport 에서 사용하는 인증 방식으로, passport-local, passport-github, passport-jwt 등이 있다.
passport에서 다양한 인증에 대해 미리 구현해놓은 것이다.

(3) passport-local 이란?
일반적으로 사용하는 username 과 password를 이용하여 쿠키/세션으로 인증하는 passport strategy이다.

[사용법: https://github.com/jaredhanson/passport-local ]

[예시] id, password를 받아서 자체 인증처리를 하는 간단한 LocalStrategy의 경우

var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; passport.use( new LocalStrategy({ usenameField: 'userId', passwordField: 'passwd', passReqToCallback: true }, function (req, userId, passwd, done){ //처리 } ));

var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 
passport.use( new LocalStrategy({ 
	usenameField: 'userId', 
    passwordField: 'passwd', 
    passReqToCallback: true 
    }, function (req, userId, passwd, done){ //처리 } ));


1. 웹인증을 위해 HTML Form으로부터 id, password를 받는 페이지 생성
2. passport.LocalStrategy의 defalut로 usernameField, passwordField인자를 읽도록 생성하여 객체를 생성
3. passReqToCallback 옵션: 인증을 수행하는 인증 함수로, HTTP Request를 그대로 전달할지 여부 결정
4. 인증 시, 호출되는 인증 함수 정의

인자: req (HTTP Request 전달), userId, passwd, done (callback 함수)

2. express-session

(1) Cookie 란?
HTTP통신은 정보를 유지할 수 없는 Connectionless, Stateless의 성격을 가지기 때문에 로그인서비스와 같은 클라이언트가 정보를 유지하는 서비스를 구현하기에 단점이 있다.

때문에 쿠키라는 개념이 도입되었다.
쿠키는 웹 서버가 브라우저에게 지시하여 사용자의 로컬 컴퓨터에 파일 또는 메모리에 저장하는 작은 기록 정보 파일이다.

하지만 쿠키는 쿠키에 대한 정보를 매번 Http Header 에 추가하여 보내기 때문에 상당한 트래픽을 발생시키고, 결제정보 등을 쿠키에 저장하였을 때 쿠키가 유출되면 보안에 대한 문제점도 발생할 수 있다는 단점이 있다.


(2) Session 이란?
쿠키의 트래픽 문제와 보안적 이슈를 해결하기 위해 도입되었다.

세션은 클라인언트-서버 간 인증 정보를 기록하여, 특정 시간동안 인증절차 없이 사용자를 신뢰하고 서비스 이용에 편의와 여러가지 정보를 제공하는데에 사용된다.

[절차]

클라이언트가 서버에 Resource 요청을 한다.
서버에서는 HTTP Request를 통해 쿠키에서 Session id 를 확인을 한 후, 없으면 Set-Cookie를 통해 새로 발행한 Session-id를 보낸다.
클라이언트는 HTTP Request 헤더에 Session id 를 포함하여 원하는 Resource 를 요청한다.
서버는 Session id를 통해 해당 세션을 찾아 클라이언트 상태 정보를 유지하며 적절한 응답을 한다.
클라이언트 종료 (브라우저 종료) 시, Session id를 제거하고, 서버에서도 Session 을 제거한다.

[특징]

세션 아이디는 브라우저 단위로 저장되고, 브라우저 종료 시 소멸된다.
로그인한 사용자에 대해서만 세션을 생성하는 것이 아니기 때문에, 로그아웃하면 새로운 사용자로 인식해서 새로운 세션이 생성된다.
사용자의 로그인 여부 등 사용자 요청 할 때마다 필요한 정보들을 세션에 넣어두면 사용자 디비에 접근할 필요가 없어서 효율적이다.

[보안]

누군가가 세션 아이디를 훔치면, 그 사용자처럼 로그인할 수 있게 되기 때문에, https를 이용해서 통신하는 것이 좋다.

(참고 사이트:

https://nesoy.github.io/articles/2017-03/Session-Cookie

https://cjh5414.github.io/cookie-and-session/)

(토큰기반 인증: https://dooopark.tistory.com/6)

(3) express-session 이란?

express-session 은 express.js 사용 시 세션/쿠키를 편하게 하기 위한 패키지이다.

[사용법: https://github.com/expressjs/session]

3. connect-flash

connect-flash는 일회성 메시지들 ( 로그인 에러나 회원가입 에러와 같은 경고 메시지) 을 웹 브라우저에 나타낼 때 사용하는 미들웨어이다.

cookie-parser 와 express-session 을 사용하므로 뒤에 위치해야한다.

 

 

[출처] Passport 기반 인증 처리|작성자 깐니

 

안뇽 : 네이버 블로그

당신의 모든 기록을 담는 공간

blog.naver.com

 

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

[NodeJS] 공식문서 개념정리  (1) 2020.04.25