Node js란?

  • javascript 기반 서버 플랫폼
  • 크롬 V8엔진 기반 동작
  • 이벤트 기반
  • non-blocking I/O 방식
  • 싱글 스레드 기반

- V8 엔진, 이벤트 기반

  코드를 한 줄씩 해석하면서 실행하는 인터프리터 방식의 느린 속도를 해결하기 위해 크롬의 V8엔진을 사용하였다. V8엔진은 이벤트를 받아 처리하는 이벤트 루프 기능이 있다. 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식인데, Node js는 서버쪽에서 동작하는 프로그램을 만드는 것이 주임무이기 때문에 가장 중요한 기능이다.

 

- non-blocking I/O 방식 사용

  웹 서버에 파일을 업로드할 때, 업로드가 완료되기 전까지 서버에서 다른 작업을 할 수 없는 문제를 해결하기 위해 새로운 방식의 서버개발 도구를 만들기 시작했는데, 이것이 Node.js이다. 즉, 하나의 요청 처리가 끝날 때 까지 기다리지 않고 다른 요청을 동시에 처리할 수 있는 비동기 입출력(non-blocking I/O)방식을 적용했다.

먼저, blocking I/O 란 아래 그림처럼 프로그램이 읽기 요청을 하면 그 동안은 프로그램이 다른 작업을 하지 않고 기다리게 된다. 파일 시스템에서 동작을 완료하고 난 후에 프로그램이 다시 다른 작업을 시작할 수 있다.

blocking I/O인 경우

  이러한 대기 시간때문에 작업 속도가 느려지는 문제가 생기게 된다.

 

  이것을 non-blocking I/O 방식으로 바꾸면 파일을 읽어들일때 대기하는 시간이 없어진다. 다시 말해, non -blocking I/O는 시작만 해둔 채 완료되지 않은 상태에서 다른 처리 작업을 계속 진행할 수 있도록 멈추지 않고 입출력 처리를 기다리는 방법을 말한다. 이는 콜백함수(callback function) 통해 해결한다. 프로그램에서는 파일 읽기 요청을 하기 전에 콜백 함수를 등록하는데, 파일 시스템은 파일 처리가 끝나면 자동으로 콜백 함수를 호출한다. 따라서 프로그램이 파일 읽기 작업이 끝날때 까지 대기하지 않아도 파일을 다 읽은 시점에 통보를 받고 파일의 내용을 화면에 보여주는 작업을 진행할 수 있다. 

blocking I/O 방식(왼쪽)일 경우와 non-blocking I/O 방식일 경우 코드 비교

 

- 싱글스레드 기반

 먼저, 스레드란 프로세스 내에서 실행되는 여러흐름의 단위를 말한다. 보통 한 프로세스 당 여러개의 스레드가 존재한다. 멀티스레드란 여러 개의 스레드가 일을 나누어서 처리하는 것을 말한다. 그렇기 때문에 하나의 스레드에 문제가 생겨도 다른 스레드로 대체가 가능하다. 반대로 싱글스레드란 주어진 작업을 혼자 처리하는 것을 말한다. 노드에도 여러 스레드가 존재하지만 직접 제어할 수 있는 스레드는 하나뿐이라 싱글스레드라고 부른다. 

 

Node js는 비동기 입출력 방식을 사용하는 이벤트 기반의 싱글스레드
장점
  • 싱글 스레드와 비동기 입출력 처리에 기반한 빠른 속도
  • 멀티 스레드 방식에 비해 컴퓨터 자원을 적게 사용
  • 입출력 작업이 많은 서버에 적합
  • 비교적 높은 생산성
  • 웹 서버가 내장되어 있음
  • JSON형식과 호환이 쉬움
단점
  • 싱글 스레드라 하나의 큰 작업이 들어오면 부하가 크게 걸림
  • CPU작업이 많은 서버로는 부적합
  • 콜백함수가 중첩될 경우 가독성이 떨어짐
  • 규모가 큰 서버에는 관리가 어려움

 


노드를 쉽게 사용할 수 있게 해주는 '모듈'

 

모듈이란 특정한 기능을 하는 함수느 변수들의 집합을 말한다. 자체로도 하나의 프로그램이면서 다른 프로그램의 부품으로 사용이 가능하다. 모듈로 만들어두면 모듈을 재사용할 수 있다.

모듈 만들기 두 가지 방법
모듈 불러오기

 

 do it! Node.js 프로그래밍과 세미나 ppt를 참고하여 작성하였습니다.

 

'_정리&복습_' 카테고리의 다른 글

[OS] CPU스케줄링 - 스케줄링 알고리즘  (0) 2019.04.29
[OS] CPU스케줄링 - 기본 개념  (0) 2019.04.19
[솝트] 2차 세미나 (Node js 모듈 정리)  (0) 2019.04.19
OAuth2.0 flow  (0) 2019.02.27
OAuth 2.0  (0) 2019.02.18

오늘은 전에 정리해 두었던  OAuth2.0의 네가지 인증방식의 플로우를 정리해보려고 합니다.


쿼리 문자열에 클라이언트 아이디, 코드, 리다이렉트 URI등을 포함시켜 get 또는 post 방식으로 넘겨주는 방식으로 서버 사이에서 서로 정보(?)를 주고 받습니다.


아래는 각 인증방식의 플로우와 각 번호의 추가적인 설명을 적어보았습니다ㅇ...


먼저 Resource Owner Credential Grant Type입니다. Password Grant라고도 합니당


이 타입은 자사 앱(client)에 직접 로그인하는 방식을 말합니다. 그렇기 때문에 code를 발급받을 필요없이 client로 바로 로그인이 가능합니다.


2. 클라이언트는 포스트 방식으로 매개변수를 전달합니다

- grant_type(여기서는 password)

- client_id

- client_secret

- scope

- username, password

4, 5. authorization server는 아래 내용을 포함하는 JSON파일로 응답합니다.

- token_type(bearer)

- expires_in

- access_token

- refresh_token


다음은 Authorization Code Grant Type입니다


1. 사용자가 client에 접속합니다.

2. 리다이렉트 할 때 문자열 매개변수에 다음을 포함합니다.

- response_type

- client_id

- redirect_uri

- scope

- state with a CSRF token (선택사항)

3. 사용자가 로그인 정보를 전달합니다(로그인 시도).

4. 로그인에 성공하면 2번에서 쿼리 스트링에 포함시켜 넘어온 클라이언트 아이디, 리다이렉트 uri등을 확인하여 일치하는지 확인합니다.

5, 6. owner가 승인하면 client로 리다이렉트할 때 쿼리 매개변수에 다음을 포함합니다.

- code(authorization code를 말합니다)

- state(client로부터 받은 정보 일치 여부 상태를 말합니다)

7. code를 통해 client가 authorization server에 직접 접근할 수 있게 됩니다. client가 POST요청을 보낼 때 쿼리 매개변수에 다음을 포함합니다.

- grant_type(여기서는 authorization_code를 말합니다)

- client_id

- client_secret

- redirect_uri

- code(authorization code)

8. code와 7번에서 받은 정보들을 확인하여 전부 일치하면 access token을 발급합니다. authorization server는 아래 내용을 포함하는 JSON파일로 응답합니다.

- token_type

- expires_in

- access_token

- refresh_token

9. client는 token을 통해 resource server에 직접 접근할 수 있게 됩니다.

* 이때 보통 access token의 유효기간(expires_in)은 한시간 정도입니다. access token의 유효기간이 지나면 refresh token을 통해 access token을 다시 발급받고 resource server에 접속할 수 있게 됩니다.


세번째로는 Implicit Grant Type입니당

이 방식은 authorization code grant type과 비슷하지만 code를 발급받지 않는다는 점과 refresh token이 없다는 점이 다릅니다.


2. 리다이렉트 할 때 쿼리 문자열의 매개변수를 사용해서 다음을 포함합니다.

- response_type

- client_id

- redirect_uri

- scope

- state with a CSRF token (선택사항)

5, 6. owner가 승인하면 client로 리다이렉트 할 때 쿼리 매개변수에 다음을 포함합니다.

- token_type

- expires_in

- access_token

- state(client로부터 받은 정보가 일치하는지 여부 상태를 말합니다)

* Implicit grant type은 refresh token이 없습니다. 


마지막으로 Owner가 없는 Client Credential Grant Type입니당

이 방식은 owner가 존재하지 않으며, client가 직접 authorization server에 접근할 수 있습니다.


1. client가 POST방식으로 쿼리 매개변수를 전달합니다.

- grant_type(여기서는 client_credentials입니다)

- client_id

- client_secret

- scope

4, 5. authorization server는 아래 내용을 포함하는 JSON파일로 응답합니다.

- token_type(bearer)

- expires_in

- access_token 






확실히 authorization code grant type만을 집중적으로 공부해서 그런지 2번만 그나마 자세히 써지는 것 같네요,,,

좀 더 공부해야 할 것 같습니다. 제가 혼자 공부하면서 만들어 본 flow라 틀린 내용이 있을 수도 있습니다... ㅠ3ㅜ.....

D+36


와 벌써 현장실습 끝나가...

어쩌면 좋으늬...ㅎ... authorization server 완성 못하고 끝낼듯ㅠㅠ


client ID, client secret, redirect uri는 default 값으로 내가 지정한다.

authorization code, access token은 인코딩


authorization code요청

https://resource.com?client_id=abc&redirect_uri=http://client.com


access token 요청

https://resource.com?client_id=abc&client_secret=1234&grant_type=authorization_code&code=cba&state=good

access token 형태(JSON)

{

“access_token”:”aaaAbcD+1234”,

“refresh_token”:”Abced1gf5”,

“token_type”:”bearer”,

“expires_in”:”3600”

}


base64란?

8비트 이진데이터를 ACSII문자로 변화하거나 그 반대로 변환하는 인코딩 방법을 말한다. 64가 2의 제곱수이며, 2의 제곱수들에 기반한 진법들 중에서 화면에 표시되는 ASCII코드를 써서 표현할 수 있는 가장 큰 진법이다.


만드는 방법

  1. 문자에 해당하는 ASCII코드로 바꾸어준다.

  2. 그 ASCII코드를 8bit 이진수로 바꾸어준다.

  3. 2에서 8bit로 바꾸어준 숫자를 6bit씩 끊어준다.

  4. 6bit씩 끊은 수를 다시 10진수로 변환한다.

  5. 마지막으로 10진수로 변환한 숫자를 Base64의 색인표에 따라 숫자에 해당하는 알파벳으로 변환해준다.

  6. 만약 남은 비트가 3byte미만이라면 버퍼의 남은 부분을 0으로 채워준다.

  7. 문자의 끝에는 끝을 알리는 ‘=’을 추가해준다.


<script>

opener : 팝업창에서 부모창으로 이동할 때 사용한다.

아래 코드 팝업 창을 나타낸 코드인데, ‘승인’버튼을 누르면 부모 창이 “http://localhost:3000/public/signup_O.html”로 이동하는 코드이다.

1

2

3

4

5

6

7

8

<input type="submit" id="admit" value="승인" onclick="goClient()">

<script>

   function goClient(){

       self.close();

       opener.location.href = "http://localhost:3000/public/signup_O.html"

   }

</script>

cs






3000번 - 로그인

4000번 - ★☆로 로그인 화면, 동의 팝업창, 동의하면 코드생성&보내기

5000번 - 3000번이 코드 받은 뒤에 5000번으로 접근, 그 전까지는 4000번이 5000번으로 접근



ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

쿼리 문자열 받아와서 사용하는 법 & 구현하기

(코드에 문제 있다고 표시한 부분부터 확인하기)

code어떻게 받아올 것인지 고민

client id, secret, redirect uri어디에 저장할 것인지 고민(client server와 oauth server 각각)


내일 세가지 완성하기

'동계현장실습' 카테고리의 다른 글

19.02.20 수요일  (0) 2019.02.21
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

략간스트,, 처음에 문제 파악(?)하는데 쬐에끔 걸렸다ㅋㅋㅋ

말 그대로 숫자를 N개대로 입력 받고, 합쳐서 M이 나오는 경우의 수를 구하는 것인데, 연속된 숫자들을 합했을 때 M이 나오는 경우의 수이다. 근데 지금 보니까 문제를 잘못 풀은 것 같다. 전부 예전에 풀었던 문제들을 다시 공부하는 차원에서 정리하는 중인데 '투 포인터'라는 개념을 사용해서 풀어야 하는 것 같다. 일단은 내가 풀었던 코드 정리 한 번하고 다음에 다시 투 포인터라는 개념을 가지고 풀어봐야겠다.



나는 그냥 배열에 때려박았숨다. >.<

문제에서는 입력받을 숫자갯수는 N, 연속된 수의 합은 M으로 지정했는데 코드에서는 num과 sum으로 선언했다.(N = num, M = sum)

그냥 차례대로 더하면서(이 숫자는 sum_에 저장) sum과 같아지면 count++해 주고 sum을 넘기면 한칸 옆으로 넘어가서(k++) 다시 숫자들을 연속적으로 합해주었다. 참 쉽죠잉...?ㅎ... 


그르니께 그림으로 간단하게 설명하자면 다음과같이 k가 num-1번째까지 반복하는 것이닷,,,




코드에 설명을 주석으로 추가로 달아 놓았당

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
int main(void) {
    //num은 입력받을 숫자 갯수, sum은 연속된 숫자들의 합, arr은 입력받을 숫자들을 저장할 배열
    int num, sum, *arr; 
    scanf("%d %d"&num, &sum);
 
    //배열의 크기를 할당해 주고 배열에 숫자들을 저장해 줌
    arr = (int *)malloc(num * sizeof(int));
    for (int i = 0; i < num; i++)
        scanf("%d"&arr[i]);
    
    //k는 시작점, sum_은 연속된 숫자들의 합, count는 경우의 수
    int k = 0, sum_, count = 0;
 
    //k는 배열의 마지막까지 옮겨가야함
    while (k < num) {
 
        //sum_을 0으로 초기화 시킴
        sum_ = 0;
 
        //인덱스k번째부터 배열의 숫자들을 더해
        for (int i = k; i < num; i++) {
            sum_ += arr[i];
 
            //sum과 같아지면 count++해 주고 for문을 빠져나감
            if (sum_ == sum) {
                count++;
                break;
            }
            
            //sum보다 커지면 더 이상 더해 줄 필요가 없으므로 for문을 빠져나감
            else if (sum_ > sum)
                break;
        }
        
        //시작점을 한 칸 옆으로!
        k++;
    }
    printf("%d", count);
    free(arr);
    return 0;
}
 
cs


흑... 알고리즘 공부 좀 열심히해야겠다...




D+33


oauth2-server모듈 공부하기


[단어정리]

API란?

사전적인 의미로는 Application Programming Interface의 약자로 응용 프로그램에서 사용할 수 있도록 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻한다고 한다. 프로그램과 또 다른 프로그램을 연결해주는 역할을 한다고 볼 수 있다. 즉 어플리케이션의 프로그래밍을 위한 인터페이스라고 할 수 있다. 프로그램간 커뮤니케이션을 담당한다.


restAPI란?

  • REST(REpresentational State Transfer) : 대표적인 상태 전달.

 웹에 존재하는 모든 자원에 고유한 URI를 부여해 활용하는 것으로 자원을 정의하고 자원에 대한 주소를 지정하는 방법론을 의미한다. 따라서 Restful API는 REST특징을 지키면서 API를 제공하는 것을 말한다.

 어플리케이션의 복잡도가 증가하면서 어플리케이션을 어떻게 분리하고 통합하느냐가 주요 이슈가 되었고, 그래서 REST가 떠오르고 있다.

  • REST의 구성

  1. 자원(resource) : URI

  2. 행위(verb) : HTTP Method

  3. 표현(representations)

ex) /users GET

         /users/{id} GET

    /users PUT

  • REST의 특징

  1. uniform(유니폼 인터페이스) : HTTP표준에만 따른다면, 특정언어나 기술에 종속되지 않고 모든 플랫폼에 사용이 가능하며, URI로 지정한 리소스에 대한 조작이 가능한 아키텍처 스타일을 의미한다.

  2. stateless(무상태성) : HTTP는 Stateless Protocol이므로 REST역시 무상태성을 갖는다. 즉, HttpSession과 같은 컨텍스트 저장소에 상태정보를 따로 저장하고 관리하지 않고, API 서버는 들어오는 요청만을 단순 처리하면 된다. 세션과 같은 컨텍스트 정보를 신경쓸 필요가 없어 구현이 단순해진다.

  3. cacheable(캐시가능) : HTTP기존의 웹표준을 그대로 사용하기 때문에 웹에서 사용하는 기존의 인프라를 그대로 활용이 가능하다.

  4. self-descriptiveness(자체표현구조) : method+url로 이루어져있어 어떤 메소드에 무엇을 하는지 알 수 있으며, 메시지 포맷 역시 json을 이용해 직관적으로 이해가 가능한 구조이다.

  5. 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) =&gt; {

   // The request was successfully authenticated.

 })

 .catch((err) =&gt; {

   // The request failed authentication.

 });



<특징>

  1. scope와 함께 인증 코드, 클라이언트 자격증명, 토큰 및 비밀번호 부여 새로고침 및 확장 승인을 지원한다.

  2. RFC 6749 및 RFC 6750을 준수한다.

  3. 모든 형태의 저장소를 지원한다. 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 설정>

  1. /oauth2/authorize

  2. /oauth2/authorize/decision

  3. /oauth2/token

scope를 설정할 때에는 scope를 정의하고 http body의 scope필드를 활용하면 된다.


<database 설정>

authorization server가 데이터를 가지고 있어야 한다.

  1. 등록된 client에 대한 정보

    1. client name

    2. client id

    3. client secret

    4. refresh token 여부

    5. callback uri

  2. 등록된 사용자들의 id와 password

  3. access token을 얻기 위해 발행된 code정보

  4. 발행된 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

D+32


어떤 페이지 구현할 것인지

로그인/회원가입 화면 구현하기

DB에 정보 저장할 수 있게 구현하기

mySQL/mongoDB사용

mysql설치하기


[node.js+mysql] 회원가입/로그인 구현하기

mysql을 사용하기 위해 먼저 app.js파일에 연결 설정을 해주어야 한다.

1

2

3

4

5

6

7

8

9

10

11

12

// mysql 모듈 불러오기

var mysql = require('mysql');

//MySQL 연결 설정

var pool      =    mysql.createPool({

   connectionLimit : 10,

   host     : 'localhost',

   user     : 'root',

   password : '123456',

   database : 'test',

   debug    : false

});


관계형 데이터베이스에 연결할 때에는 보통 커넥션 풀(connection pool)을 사용한다. 이는 데이터베이스 연결 객체가 너무 많이 만들어지는 것을 막고 한 번 만든 연결을 다시 사용할 수 있게 한다. 커넥션 풀은 createPool 메소드에 객체를 추가하여 만든다. 객체의 종류에는 connectionLimit, host, port, user, password, database, debug가 있다.


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

26

27

28

29

30

31

32

33

34

35

36

37

38

39

//사용자를 등록하는 함수

var addUser = function(id, name, age, password, callback) {

   console.log('addUser 호출됨 : ' + id + ', ' + password + ', ' + name + ', ' + age);

   

   // 커넥션 풀에서 연결 객체를 가져옴

   pool.getConnection(function(err, conn) {

       if (err) {

           if (conn) {

               conn.release(); // 반드시 해제해야 함

           }

           callback(err, null);

           return;

       }

       console.log('데이터베이스 연결 스레드 아이디 : ' + conn.threadId);

       // 데이터를 객체로 만듦

       var data = {id:id, name:name, age:age, password:password};

       

       // SQL 문을 실행함

       var exec = conn.query('insert into users set ?', data, function(err, result) {

           conn.release();  // 반드시 해제해야 함

           console.log('실행 대상 SQL : ' + exec.sql);

           

           if (err) {

               console.log('SQL 실행 시 에러 발생함.');

               console.dir(err);

               callback(err, null);

               return;

           }

           callback(null, result);

       });

       

       conn.on('error', function(err) {      

             console.log('데이터베이스 연결 시 에러 발생함.');

             console.dir(err);

             callback(err, null);

       });

   });

}


사용자를 등록하는 함수 즉, 회원가입 하는 함수이다. 데이터를 객체로 만드는 부분은 회원가입 과정에서 이름, 아이디, 패스워드 등을 입력할 때 한 묶음으로 정보를 저장하기 위한 과정이다. 객체 안의 정보가 하나라도 틀리면 그는 일치하는 정보가 아닌 것이다. SQL문으로 표현하면 다음과 같다.


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

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

// 사용자를 인증하는 함수

var authUser = function(id, password, callback) {

   console.log('authUser 호출됨 : ' + id + ', ' + password);

   

   // 커넥션 풀에서 연결 객체를 가져옴

   pool.getConnection(function(err, conn) {

       if (err) {

           if (conn) {

               conn.release(); // 반드시 해제해야 함

           }

           callback(err, null);

           return;

       }

       console.log('데이터베이스 연결 스레드 아이디 : ' + conn.threadId);

         

       var columns = ['id', 'name', 'age'];

       var tablename = 'users';

       // SQL 문을 실행합니다.

       var exec = conn.query("select ?? from ?? where id = ? and password = ?"

                       , [columns, tablename, id, password], function(err, rows) {

           conn.release();  // 반드시 해제해야 함

           console.log('실행 대상 SQL : ' + exec.sql);

           

           if (rows.length > 0) {

               console.log('아이디 [%s], 패스워드 [%s] 가 일치하는 사용자 찾음.', id, password);

               callback(null, rows);

           } else {

               console.log("일치하는 사용자를 찾지 못함.");

               callback(null, null);

           }

       });

       conn.on('error', function(err) {      

           console.log('데이터베이스 연결 시 에러 발생함.');

           console.dir(err);

           callback(err, null);

     });

   });

}


사용자를 인증하는 함수 즉, 로그인 하는 함수이다. 클라이언트로부터 전달받는 파라미터는 아이디와 비밀번호이다. authUser함수는 두 개의 파라미터와 함께 콜백 함수를 전달 받는다. 그 안에서 getConnection 메소드를 통해 커넥션 풀에서 연결 객체를 가져온다. 그 다음에는 연결 객체의 쿼리 메소드로 SQL문을 실행하는데 데이터를 조회해야 하기 때문에 select문을 사용한다. 쿼리 메소드로 전달하는 첫 번째 파라미터는 SQL문이고 두 번째 파라미터는 배열객체이다. 쿼리문은 ?? 또는 ? 기호를 통해 나타낸다.


OAuth와 JWT

JWT는 토큰 유형이고 OAuth는 토큰을 발급하고 인증하는 방식이다. 또한 bearer기반의 토큰방식이다. access token은 주로 세션에 담아서 관리한다. refresh token은 중요하기 때문에 주로 데이터베이스에 저장하고 관리한다.


oauth2-server 모듈 사용

app.oauth = oauthserver({

model : require(‘./oauth/model’), //oauth2의 각종 인증 함수를 구현해 놓은 곳

grants : [‘password’],

debug : true

});


[oauth2-server 모듈 공부하기]

https://www.npmjs.com/package/node-oauth2-server - 참고하기

https://oauth2-server.readthedocs.io/en/latest/docs/getting-started.html - 여기도 참고하기



'동계현장실습' 카테고리의 다른 글

19.02.25 월요일  (0) 2019.02.26
19.02.20 수요일  (0) 2019.02.21
19.02.18 월요일  (0) 2019.02.19
19.02.14 목요일  (0) 2019.02.15
19.02.13 수요일  (0) 2019.02.13

+ Recent posts