본문 바로가기
Back_end/node.js

node.js) 토큰기반인증과 토큰의 생성(JWT), 암호화, 2진법

by nomfang 2021. 5. 27.
728x90
반응형

토큰기반 인증

클라이언트가 서버에게 id/pw 검증 요청

클라이언트 서버에서 id/pw 검증, 맞으면 토큰 생성 (암호화)

서버는 클라이언트에게 토큰만 응답

클라이언트는 토큰을 저장 (cookie에 저장 - 가장 안전하다고 생각되는?)

클라이언트는 매 요청마다 토큰을 보냄

JWT - json web tokken

웹이나 앱에서 토큰을 교환할 때 사용

2진법

2진법은 16진법과 가깝다..?

바이너리 파일 -> 문자를 16진수로 바꾼 파일, 대부분의 파일이 바이너리 형식

비트 숫자가 같기 때문에 16진수로 표현하기 쉬움 - 컴퓨터는 2진수를 사용

16진수는 64진수와 가깝다

64진수가 16진수보다 비트를 적게 사용하기 때문에 64진수로 변환

2진법 변환

숫자를 2로 나누었을때 나머지가 1이면 1 0이면 0

15 -> 1111 (4비트)

15 - > F (16 진수)

16진수 - 0

9 A

F 사용


    let header = {
        "alg": "HS256",
        "typ": "JWT"
    }

    let txt = 'hi';
    let txt2 = Buffer.from(txt); // 16진수로 바꿈
    let txt3 = txt2.toString('base64').replace('=','');

    let encodedHeader = Buffer.from(JSON.stringify(header)).toString('base64').replace('=','');

    let payLoad = {
        "sub": "1234567890",
        "name": "John Doe",
        "user" : "swk",
        "iat": 1516239022
    }

    let encodedPayLoad = Buffer.from(JSON.stringify(payLoad))
                                            .toString('base64') // 64비트로 바꿈
                                            .replace(/=/g,'');  // 정규표현식 모든 = 제거
                                            // 인코딩 과정에서 남는 비트가 3비트 미만일 경우
                                            // 버퍼에 남은 부분을 '=' 로 반환?


    // createHmac 인자 ->  1. 암호화 형태 2. 암호화 규칙(16 진수) 둘 다 String 형식
    let rule = Buffer.from('ing');
    let signature = crypto.createHmac('sha256', rule)
                                    .update(`${encodedHeader}.${encodedPayLoad}`)
                                    .digest('base64').replace(/=/g,'')

    console.log `${encodedHeader}.${encodedPayLoad}.${signature}`;
반응형

댓글