MEAN Stack Front to Back (MEANAuthApp)

Slides:



Advertisements
Similar presentations
1. 브라우저에서 로 관리창으로 접속해서, 서버 인증서를 설치 할 서버를 선택하고 Manage 버튼을 클릭합니다. 2. Security 탭을 선택한 후, 인증서 Trust.
Advertisements

해외전자정보서비스이용교육 EBSCO eBook (NetLibrary)
EBSCO eBooks 이용 방법 및 다운로드 (대출모드) 안내
목차 Contents 무선인터넷용 비밀번호 설정방법 Windows 7 Windows 8 Windows XP MAC OS.
Chapter 07 : 서블릿 고급2. chapter 07 : 서블릿 고급2 학습목표 세션 tracking hidden 태그 이용 encodeURL 메소드 사용법 URL 파라미터 이용 쿠키 이용 세션 이용 encodeURL 메소드 사용법.
Nov Youn-Hee Han Term Project 안내 Nov Youn-Hee Han
Oozie Web API 기능 테스트 이승엽.
MEAN Stack Front to Back (MEANAuthApp)
패스포트로 사용자 인증하기 9장 Do it! Node.js 프로그래밍 이지스퍼블리싱 제공 강의 교안 2017/03
Database Laboratory, Hong Ik University
㈜디아이씨 SSLVPN 협력사 접속방법 2017년 4월.
SSL - VPN 사용자 가이드 - IT 지원실 네트워크 운영팀 -.
웹어플리케이션보안 인증서 활용 중부대학교 정보보호학과 이병천 교수.
PHP입문 Izayoi 김조흔.
데이터 파일 C 데이터 파일과 스트림(Stream) 텍스트 파일 처리
9. Deploying mean applications
MEAN Stack Front to Back (MEANAuthApp)
MEAN Stack Front to Back
4-1장. MySQL 제13장.
MEAN Stack Front to Back (MEANAuthApp)
ServerGuide CD를 이용한 xSeries 설치가이드
Outlook Addin 설치 방법 및 매뉴얼
MEAN Stack Front to Back (MEANAuthApp)
Powerpoint 프리젠테이션을 로 보내기 [twitter]1. 파워포인트 프리젠테이션을 트위터로 보내기[/twitter]
웹 어플리케이션 보안 2016년 2학기 4. Restful node apI 만들기.
웹 어플리케이션 보안 2016년 2학기 3. Mongo db.
웹 어플리케이션 보안 2016년 2학기 5. Node Authentication.
13. 연산자 오버로딩.
(인터페이스 상세 이용 방법 및 다운로드 (대출모드) 안내)
인터넷응용프로그래밍 JavaScript(Intro).
설치 환경 □ 운영체제 버전 : CentOS Linux 7.2 □ 리눅스 커널 버전 :
MEAN Stack Front to Back
1. SSLVPN 접속 방법 Internet Explorer 실행(타 브라우저 사용 불가)
Naxos Music Library User Guide 낙소스 뮤직 라이브러리 이용 가이드
2018년 11월 05일 박성진 Web & Internet [08] 레이아웃 P1 2018년 11월 05일 박성진
영상처리 실습 인공지능연구실.
WZC 무선 연결 방법 (Windows XP Ver.).
MEAN Stack Front to Back (MEANAuthApp)
Go Lang 리뷰 이동은.
HTTP 프로토콜의 요청과 응답 동작을 이해한다. 서블릿 및 JSP 를 알아보고 역할을 이해한다.
MEAN Stack Front to Back (MEANAuthApp)
MEAN Stack Front to Back (MEANAuthApp)
USN(Ubiquitous Sensor Network)
Nessus 4 설치 정보보호응용 조용준.
8장 쿠키와 세션 한빛미디어(주).
IOS Press Last Update : Jan, 2012.
08장 쿠키와 세션.
12장 쿠키와 세션 이장에서 배울 내용 : 쿠키와 세션은 웹 페이지 간에 정보를 유지할 때 사용된다. 쿠키와 세션은 사용되는 형태가 비슷하나, 쿠키는 웹 브라우저(클라이언트) 쪽에 저장되고, 세션은 웹 서버 쪽에 저장된다. 이 번장에서는 이들에 대해 학습한다.
PMIS 서버 설정 환경설정 작성자 : 배경환.
S-Work 2.0 DRM 신규 버전 설치 가이드 SOFTCAMP
MEAN Stack Front to Back (MEANAuthApp)
STS 에서 웹 서버 설치 방법.
암호학 응용 Applied cryptography
Oauth 인증 기술.
1. 신규 연세메일(Gmail)에 로그인 합니다. ( yonsei. ac. kr )
암호학 응용 Applied cryptography
KISTI Supercomputing Center 명훈주
3장 JSP프로그래밍의 개요 이장에서 배울 내용 : JSP페이지의 기본적인 개요설명과 JSP페이지의 처리과정 그리고 웹 어플리케이션의 구조에 대해서 학습한다.
JSP Programming with a Workbook
세션에 대해 알아보고 HttpSession 에 대해 이해한다 세션 관리에 사용되는 요소들을 살펴본다
시스템 인터페이스 Lab1 X-window 및 명령어 사용.
MIDP 네트워크 프로그래밍 ps lab 김윤경.
슬라이드 쇼의 설정 슬라이드 쇼의 실행 파일과 폴더의 관리 글꼴을 포함해서 저장 웹 페이지로 게시 압축 파일
웹어플리케이션보안 난수화 토큰인증 중부대학교 정보보호학과 이병천 교수.
채팅 및 파일전송 프로그램 권 경 곤 김 창 년.
Exporting User Certificate from Internet Explorer
MEAN Stack Front to Back
MEAN Stack Front to Back (MEANAuthApp)
20 XMLHttpRequest.
MEAN Stack Front to Back (MEANAuthApp)
Presentation transcript:

MEAN Stack Front to Back (MEANAuthApp) 4. API Authentication and Token

목차 1. 환경 구축 2. Express Setup & Routes 3. User Model and Register 4. API Authentication and Token 5. Angular 4 Components & Routes 6. Register Component, Validation & Flash messages 7. Auth Service & User Registration 8. Login & Logout 9. Protected Requests & Auth Guard 10. App Deployment to Heroku

이번 장에서 할 일 인증에 대한 개념 소개 패스포트 로그인 로그인 및 토큰발급 특정 루트 보호 토큰 인증

초기인증 vs. 인증유지 초기인증(initial login) 기술 인증유지(keeping logged in) 기술 처음 접속시의 사용자 신분 인증 ID/pass, 인증서, 고유주소, Biometrics, 멀티팩터 인증 엄밀한 인증 절차 필요 사용자 계정 DB 확인 필요 인증유지(keeping logged in) 기술 초기 인증 완료된 사용자의 인증상태를 유지하는 기술 쿠키, 세션, 토큰 등 무상태 서비스 (stateless service) 요구 사용자 계정 DB 확인 필요없는 기술 많은 사용자를 위한 확장성, 효율성이 있는 기술 필요

Passport 패스포트란? Node.js를 위한 인증 미들웨어 http://passportjs.org/ 다양한 인증정책(strategy) 적용 가능

Passport Strategy 300개 이상의 인증 정책(Strategy) 로컬인증 (해당 웹서버에서 직접 인증) 페이스북 인증, 트위터 인증, 구글 인증 (외부 인증포털에 의존) OAuth 인증 (인증 및 권한관리)

OAuth OAuth란? OAuth = Authentication + Authorization 인증 및 권한관리 프레임워크 https://oauth.net/

JSON Web Token (JWT) JWT란? 토큰 인증을 위한 표준 기술 https://jwt.io/

JSON Web Token (JWT) JWT란? open, industry standard RFC 7519 method for representing claims securely between two parties. a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally signed. JWTs can be signed using a secret (with the HMAC algorithm) or a public/private key pair using RSA.

JSON Web Token (JWT) 토큰 발급 및 인증유지 절차 로그인 토큰발급 토큰을 이용한 인증유지 Server’s secret 로그인 토큰발급 토큰을 이용한 인증유지

JSON Web Token (JWT) - 토큰 디코딩 및 정보 획득 가능 - 서명은 서버 비밀값을 이용한 HMAC 계산으로 서버만 계산 가능 Server’s secret

JWT 기능 테스트 https://jwt.io/

패스포트 로그인 적용 App.js에 패스포트 미들웨어 추가 // Body Parser Middleware app.use(bodyParser.json()); // Passport Middleware app.use(passport.initialize()); app.use(passport.session()); app.use('/users', users);

패스포트 로그인 적용 Passport-jwt 패키지 사용 Config 폴더에 passport.js 파일 작성 https://www.npmjs.com/package/passport-jwt 참조 A Passport strategy for authenticating with a JSON Web Token JWT 인증을 사용하기 위한 패스포트 정책 > npm install passport-jwt Config 폴더에 passport.js 파일 작성 Passport 관련 기능을 별도의 파일로 관리

config/passport.js 파일 작성 const JwtStrategy = require('passport-jwt').Strategy; const ExtractJwt = require('passport-jwt').ExtractJwt; const User = require('../models/user'); const config = require('../config/database'); module.exports = function(passport){ let opts = {}; opts.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('jwt'); opts.secretOrKey = config.secret; passport.use(new JwtStrategy(opts, (jwt_payload, done) => { User.getUserById(jwt_payload.data._id, (err, user) => { if (err) { return done(err, false); } if (user) { return done(null, user); } else { return done(null, false); }); })); 옵션을 작성 - 토큰은 AuthHeader에서 jwt token을 추출 - 토큰생성에 사용할 비밀키 설정 패스포트에 JWT strategy 적용 에러 발생시 에러 출력 인증에 성공하면 user 정보 출력 인증에 실패하면 false 출력 passport를 파라메터로 전송 https://www.npmjs.com/package/passport-jwt 참조

토큰 전송 토큰은 여러 가지 방법으로 보낼 수 있음

패스포트 로그인 App.js에서 passport.js를 읽어옴 // Body Parser Middleware app.use(bodyParser.json()); // Passport Middleware app.use(passport.initialize()); app.use(passport.session()); require('./config/passport')(passport); app.use('/users', users); passport를 파라메터로 전송

인증(/authenticate) 기능 추가 router.post('/authenticate', (req, res, next) => { const username = req.body.username; const password = req.body.password; User.getUserByUsername(username, (err, user) => { if(err) throw err; if(!user) { return res.json({success: false, msg: 'User not found'}); } User.comparePassword(password, user.password, (err, isMatch) => { if(isMatch) { const token = jwt.sign({data:user}, config.secret, { expiresIn: 604800 // 1 week }); res.json({ success: true, token: 'JWT '+token, user: { // 패스워드를 제외한 나머지 필요한 정보를 리턴 id: user._id, name: user.name, username: user.username, email: user.email } else { return res.json({success: false, msg: 'Wrong password'}); routes/users.js 파일에 router.post('/authenticate’,…) 기능 추가 사용자가 입력하는 ID/pass 로그인 정보를 변수로 할당 username으로 DB를 검색 입력 패스워드와 DB에서 읽어온 패스워드해시 정보를 비교 (함수를 아직 만들지 않았음) 패스워드가 일치하면 토큰을 생성 서버비밀정보 이용, 유효기간 지정 토큰과 사용자 정보를 브라우저에 리턴 패스워드를 제외한 정보를 보내기 위해 User객체를 재구성함 (패스워드 제외)

인증(/authenticate) 기능 추가 jwt.sign 함수에서 config.secret 변수 사용을 위해 routes/users.js 파일에 다음 선언을 추가해야 함 패스워드 로그인시 패스워드 인증 기능 추가 현재의 입력 패스워드와 DB에 저장된 패스워드해시값을 비교하 여 로그인 허용 여부 결정 models/user.js 파일에 패스워드비교(comparePassword) 함수 추 가 - bcrypt.compare 함수 이용 const config = require('../config/database');

models/user.js에 comparePassword 함수 추가 module.exports.addUser = function(newUser, callback){ bcrypt.genSalt(10, (err, salt) => { bcrypt.hash(newUser.password, salt, (err, hash) => { if(err) throw err; newUser.password = hash; newUser.save(callback); }); } module.exports.comparePassword = function(candidatePassword, hash, callback){ bcrypt.compare(candidatePassword, hash, (err, isMatch)=>{ callback(null, isMatch); 로그인시 입력 패스워드 계정 DB에 등록된 패스워드해시 패스워드가 일치하는 경우 isMatch=true 리턴 https://www.npmjs.com/package/bcrypt 참조

Postman으로 로그인 테스트 (1) 새로운 탭 열기 (3) Send (4) 서버의 응답 토큰이 생성되어 발급받았음 사용자 정보 받음 (패스워드 제외) (2) 위 주소로 POST 선택 Headers 정보 입력 Body/raw 로 username/password 입력

특정 루트 보호 특정 루트는 로그인 이후에만 사용 가능하도록 보호 프로필 루트는 토큰을 이용하여 접근하도록 설정 http://localhost:3000/users/profile 로그인 안된 상태에서는(토큰이 없으면) 접근 금지 routes/users.js 파일에서 프로필 보기 부분을 수정 // Profile router.get('/profile', passport.authenticate('jwt', {session:false}), (req, res, next) => { res.json({user: req.user}); }); 토큰인증이 성공한 경우에만 user 데이터를 응답함

Postman을 이용한 테스트 앞의 로그인 결과에서 Token 부분을 복사

Postman을 이용한 테스트 (1) GET (2) 프로필 주소 (4) Send (3) Headers의 Authorization 값에 앞에서 복사한 토큰을 붙여넣기

Postman을 이용한 테스트 토큰으로 로그인 성공

요약 초기인증과 인증유지의 개념 패스워드 로그인 로그인시 JWT 토큰 발급 토큰인증 활용한 기술 입력 패스워드와 계정DB에 저장된 패스워드 해시 비교 로그인시 JWT 토큰 발급 토큰인증 특정 루트 접근시 토큰을 요구 토큰 제시하는 요청에 인증유지 활용한 기술 Passport.js를 이용한 인증정책 활용 (로컬인증) JWT형식의 토큰 발급 및 활용 Passport-jwt를 이용한 passport와 JWT 연동