D+33
oauth2-server모듈 공부하기
[단어정리]
API란?
사전적인 의미로는 Application Programming Interface의 약자로 응용 프로그램에서 사용할 수 있도록 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻한다고 한다. 프로그램과 또 다른 프로그램을 연결해주는 역할을 한다고 볼 수 있다. 즉 어플리케이션의 프로그래밍을 위한 인터페이스라고 할 수 있다. 프로그램간 커뮤니케이션을 담당한다.
restAPI란?
REST(REpresentational State Transfer) : 대표적인 상태 전달.
웹에 존재하는 모든 자원에 고유한 URI를 부여해 활용하는 것으로 자원을 정의하고 자원에 대한 주소를 지정하는 방법론을 의미한다. 따라서 Restful API는 REST특징을 지키면서 API를 제공하는 것을 말한다.
어플리케이션의 복잡도가 증가하면서 어플리케이션을 어떻게 분리하고 통합하느냐가 주요 이슈가 되었고, 그래서 REST가 떠오르고 있다.
REST의 구성
자원(resource) : URI
행위(verb) : HTTP Method
표현(representations)
ex) /users GET
/users/{id} GET
/users PUT
REST의 특징
uniform(유니폼 인터페이스) : HTTP표준에만 따른다면, 특정언어나 기술에 종속되지 않고 모든 플랫폼에 사용이 가능하며, URI로 지정한 리소스에 대한 조작이 가능한 아키텍처 스타일을 의미한다.
stateless(무상태성) : HTTP는 Stateless Protocol이므로 REST역시 무상태성을 갖는다. 즉, HttpSession과 같은 컨텍스트 저장소에 상태정보를 따로 저장하고 관리하지 않고, API 서버는 들어오는 요청만을 단순 처리하면 된다. 세션과 같은 컨텍스트 정보를 신경쓸 필요가 없어 구현이 단순해진다.
cacheable(캐시가능) : HTTP기존의 웹표준을 그대로 사용하기 때문에 웹에서 사용하는 기존의 인프라를 그대로 활용이 가능하다.
self-descriptiveness(자체표현구조) : method+url로 이루어져있어 어떤 메소드에 무엇을 하는지 알 수 있으며, 메시지 포맷 역시 json을 이용해 직관적으로 이해가 가능한 구조이다.
client-server구조 : 클라이언트와 서버의 역할이 구분되어, 서로 간의 의존성이 줄어든다.
[OAuth2-server 모듈]
<사용 예시>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | const OAuth2Server = require('oauth2-server'); const Request = OAuth2Server.Request; const Response = OAuth2Server.Response;
const oauth = new OAuth2Server({ model: require('./model') });
let request = new Request({ method: 'GET', query: {}, headers: {Authorization: 'Bearer foobar'} });
let response = new Response({ headers: {} });
oauth.authenticate(request, response) .then((token) => { // The request was successfully authenticated. }) .catch((err) => { // The request failed authentication. }); |
<특징>
scope와 함께 인증 코드, 클라이언트 자격증명, 토큰 및 비밀번호 부여 새로고침 및 확장 승인을 지원한다.
RFC 6749 및 RFC 6750을 준수한다.
모든 형태의 저장소를 지원한다. ex) MySQL, MongoDB, Redis 등
<API>
1. OAuth2Server
new OAuth2Server(options)
option의 타입은 object이다. OAuth2Server의 authenticate(), authorize(), token()에 대한 유효한 옵션은 생성자에도 전달될 수 있다. 제공된 옵션은 다른 메소드의 기본값으로 사용된다.
1 2 3 4 5 6 7 | const OAuth2Server = require('oauth2-server');
const oauth = new OAuth2Server({ model: require('./model'), allowBearerTokensInQueryString: true, accessTokenLifetime: 4 * 60 * 60 }); |
authenticate(request, response, [options], [callback])
authorize(request, response, [options], [callback])
authorize는 토큰이 필요하다.
token(request, response, [options], [callback])
승인된 토큰 요청에 대한 새토큰을 검색한다.
2. Request
3. Response
4. Errors
[관련 모듈 설명]
oauth2orize 모듈은 OAuth2.0의 핵심 flow를 node.js로 구현해 놓은 것이다. 요청된 인증타입에 따라서 개발자가 등록해 놓은 callback function을 호출하고 해당 function이 리턴한 결과를 적절히 http resource로 만들어 client에 응답하는 모듈이다.
passport-oauth2-public-client 모듈은 authorization server가 client id만으로 client검증을 하는 경우에 사용한다. Authorization Code grant type에서 client가 access token을 요청하기 전에 code를 얻기 위해 요청하는 경우가 해당된다. 이 모듈은 http body의 client_id값을 개발자가 등록한 callback function으로 넘겨준다. client id가 유효한지 여부는 개발자가 따로 검사해야 한다.
passport-http 모듈은 authorization server가 client id와 secret을 검증할 때 사용한다. 즉, authorization code grant type이나 resource owner password grant type이 access token을 요청한 경우를 말한다.
<API 설정>
/oauth2/authorize
/oauth2/authorize/decision
/oauth2/token
scope를 설정할 때에는 scope를 정의하고 http body의 scope필드를 활용하면 된다.
<database 설정>
authorization server가 데이터를 가지고 있어야 한다.
등록된 client에 대한 정보
client name
client id
client secret
refresh token 여부
callback uri
등록된 사용자들의 id와 password
access token을 얻기 위해 발행된 code정보
발행된 access token정보
'동계현장실습' 카테고리의 다른 글
19.02.25 월요일 (0) | 2019.02.26 |
---|---|
19.02.19 화요일 (0) | 2019.02.20 |
19.02.18 월요일 (0) | 2019.02.19 |
19.02.14 목요일 (0) | 2019.02.15 |
19.02.13 수요일 (0) | 2019.02.13 |