웹 어플리케이션 보안 2016년 2학기 5. Node Authentication
5. Node Authentication Chap 10. Node Authentication
토큰기반 인증 토큰기반 인증이란? 클라이언트가 ID/pass를 제공하고 서버에 로그인하면 서버가 토 큰을 만들어 클라이언트에게 제공, 클라이언트에 토큰을 저장 클라이언트가 다음번에 서버에 접근시 토큰을 제시하고 접근하 면 ID/pass를 묻지 않고 사용할 수 있게 허용 사례: 페이스북, 트위터, 구글, github 등 한번 로그인하면 일정기 간동안 패스워드를 묻지 않고 로그인된 상태로 사용 가능
토큰기반 인증 토큰기반 인증의 장점 Stateless and scalable servers (서버는 세션정보를 저장하지 않 아도 되므로 사용자 관리가 편리) Mobile applications ready (모바일 디바이스에선 토큰기반 인증 이 필수, 패스워드 입력이 불편하기 때문) Pass authentication to other applications (타 사이트에도 인증 제공 가능, 사례: 페이스북/카카오톡으로 로그인하기) Extra security
기존의 인증방법 세션정보를 서버에 저장 Http 프로토콜은 stateless (사용자 정보를 저장하지 않음) 정보 요청시마다 로그인을 요구하는 것은 매우 번거로움 로그인을 유지하는 방법으로 사용자 로그인 정보를 서버에 저장 (세션정보를 서버의 메모리나 디스크에 저장) 이런 방법은 모바일 어플리케이션에 적용하기 어려움 세션정보를 서버에 저장
서버기반 인증의 문제점 세션정보 저장 (메모리) 확장성 CORS (cross-origin resource sharing) 사용자 수가 많아지면 서버에 부하가 큼 확장성 클라우드 환경에서 많은 분산서버들을 사용하여 서비스하는데 세션정보를 메모리에 저장하면 이러한 확장이 어려움 CORS (cross-origin resource sharing) 복수개의 모바일 기기에서 동일 데이터를 이용하는 환경 데이터 이용의 권한 관리에 어려움 CSRF (cross-site request forgery) 사이트간 요청 위조. 웹 사이트의 취약점을 이용하여 사용자가 의도하지 않는 요청을 송신하도록 하는 공격 사용자 기기가 CSRF 공격에 악용될 소지가 있음
토큰기반 인증의 동작 방법 서버는 사용자 로그인 관련 정보를 저장하지 않음 1. 클라이언트는 사용자의 ID/password로 접근 요청 2. 서버는 ID/password로 사용자 인증 3. 서버는 서명된 토큰을 생성하여 클라이언트에 제공 4. 클라이언트는 토큰을 저장, 이후의 모든 요청에 토큰을 제시 5. 서버는 토큰을 검증하고 사용자 인증 Permission-based token 생성도 가능 토큰을 클라이언트에 저장
토큰기반 인증 방식의 유용성 확장성, 유연성 (Stateless, scalable) 보안성 (Security) 인증의 확대 토큰은 클라이언트에 저장 서버는 정당한 토큰을 가지고 접근하는 클라이언트에 서비스 제공 보안성 (Security) 토큰은 쿠키가 아님, CSRF 방지 가능 토큰은 일정 시간이 지나면 무효화됨. 다시 로그인 필요 인증의 확대 토큰을 이용하여 다른 사이트와 인증 공유 가능 Selective permission to third-party applications 사례: 페이스북에 글 posting 허용 등 Multiple platforms and domains 모든 종류의 디바이스, 어플리케이션에 토큰이 있으면 접근 허용 표준기술 http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html
JSON Web Token (JWT) JSON Web Tokens (JWT) http://jwt.io Auth0 에서 만들었음 https://auth0.com/ Pronounced “jot”
JWT의 특징 토큰 정보를 JSON 형태로 저장, 전송함 많은 프로그래밍 언어 플랫폼에서 JWT 기능을 제공 .NET, Python, Node.js, Java, PHP, Ruby, Go, JavaScript, and Haskell 사용자 인증에 필요한 모든 정보가 토큰 내에 존재 토큰 정보는 쉽게 전송될 수 있음 (http header, URL등의 형태로)
JWT의 구조 JWT의 구조 Header Payload Signature Base64encode를 이용하여 인코딩
JWT 구조 헤더 페이로드 (전송할 내용) 서명 (위 내용에 대한 서버의 서명) 타입, 알고리즘 Registered claims Public claims Private claims 서명 (위 내용에 대한 서버의 서명) Registered claims secret은 서버가 가진 비밀정보 토큰은 발급한 서버만이 검증 가능함 해쉬함수를 이용하여 해쉬값 계산
JWT 사례 Base64encoded 헤더 페이로드 서명 JWT 토큰 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 eyJpc3MiOiJzY290Y2guaW8iLCJleHAiOj EzMDA4MTkzODAsIm5hbWUiOiJDaHJp cyBTZXZpbGxlamEiLCJhZG1pbiI6dHJ1ZX0 페이로드 03f329983b86f7d9a9f5fef85305880101d 5e302afafa20154d094b229f75773 서명 JWT 토큰
JWT 기능 테스트 사이트 https://jwt.io/
Node.js API에서의 인증 활용 웹서비스 인증 설계 해야 할 작업 기본 루트페이지(home page)는 인증 없이 사용 사용자 로그인 루트 제공 (login) API 루트는 인증 요구 (토큰인증 사용) 토큰을 이용한 서비스 사용 해야 할 작업 사용자의 ID/password를 이용하여 인증하는 인증 루트 설치 ID/password가 맞는 경우 토큰을 생성하여 클라이언트에 제공 API 루트는 토큰을 이용하여 접속시에만 서비스 제공
작업 절차 세팅 앞장의 node-api 폴더의 사본을 만들고 node-auth로 폴 더 이름을 변경 1. jsonwebtoken 패키지 설치 2. jsonwebtoken 객체 생성 3. 토큰 생성 및 검증시 사용하는 서버의 비밀값 설정 별도로 저장, 관리할 필요가 없으므로 복잡해도 상관없음 npm install jsonwebtoken --save var jwt = require('jsonwebtoken'); var superSecret = 'ilovescotchscotchyscotchscotch';
샘플 사용자 생성 Postman 이용 - POST http://localhost:8080/api/users
사용자 인증 및 토큰 생성 POST http://localhost/api/authenticate 루트 생성 ID, password로 인증하고 맞으면 토큰을 생성하여 제공하는 기능 다른 미들웨어보다 앞에 추가 사용자 인증은 서비스제공 전에 체크되어야 함
POST http://localhost/api/authenticate 토큰 생성 토큰을 JSON형식으로 클라이언트에게 제공 브라우저 화면에 표시
인증 및 토큰 생성 인증하고 토큰을 받은 모습
인증 실패 사례 User not found Wrong password
API 루트를 보호하기 위한 미들웨어 설정 Jwt.verify() 메서드 이용하여 토큰 검증 POST 파라메터로 제공 URL 파라메터로 제공 HTTP 헤더로 제공 Jwt.verify() 메서드 이용하여 토큰 검증
토큰을 이용한 인증 테스트 토큰을 제공하지 않고 /api에 접근하면 실패
HTTP Header를 통한 토큰 전달 사용자의 토큰을 복사한 후 헤더에 x-access-token으로 입력 인증 성공
URL 파라메터를 통한 토큰 전달 GET - http://localhost:8080/api/users?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJu YW1lIjoiQ2hyaXMiLCJ1c2VybmFtZSI6ImNocmlzIiwiaWF0IjoxNDcwOTk5OTk0LCJleH AiOjE0NzEwODYzOTR9.2BTjCaBdllrNv01S8V6tpgTC0-mXtjZx0zR0p6_JU7A 인증성공
로그인된 사용자 정보 제공을 위한 루트 GET http://localhost:8080/api/me
인증을 위한 다른 모듈들 PassporJS Express-jwt http://passportjs.org/ 가장 발전된 구현방식?! 다양한 인증방식 제공: session based security social based authentication JWT security Express-jwt https://github.com/auth0/express-jwt 인증을 위한 미들웨어를 자동 생성
요약 토큰 인증 기능이 부가된 API 완성 Facebook, Google, Twitter, GitHub 등 대형 회사들이 이 러한 인증기술을 이용 이런 인증기술을 기반으로 발전된 인증기능 구현 가능 user specific permissions group permissions 웹 어플리케이션에서 보안과 인증은 매우 중요한 요소 공격기술, 방어기술이 계속 발전하고 있으므로 최신기술 에 관심을 기울여야 함