TIL

Nodejs 강의 숙련 JWT(Json Web Token) (3) ps.콜백함수

황민도 2024. 5. 23. 11:31

내일배움캠프 스파르타 코딩클럽

 

JWT 를 알아보기에 앞서 지난 콜백 함수를 잠시 회고 하고자 한다.

 

코드에 대해 알다가도 모를 시기

JavaScript 라는 언어로 코드를 짤때 그 해석 조차 어려울 때가 아직도 생생히 기억이 난다.

물론 지금도 마찬가지이지만 확실히 Node.js 에서 활용되는 도구들을 사용하니 훨씬 더 많은 배움과

암기해야 할 명령어들이 부쩍 늘어났다.

그러다보니 머릿속이 정리가 안되는 느낌이 많이 든다.

복잡하게 널부러져있는 도구들 사이에 머리가 복잡하여 미처 발견하지 못했던

익숙한 얼굴이 보여 반갑게도 회고 할만한 부분 이 있다.

이전까지 콜백 함수라는 것에 대해 제대로 이해하지 못하고 있었는데 다행이 이시점에 이해를 하게되었다.

콜백 함수라는 것이 함수안에 함수가 있고 그 함수 안에 함수가 있는 함수가 불러지는 그런 정의를 하게끔

잘못된 이해를 하고있고 그 속에 있는 걸 불러내는 그 자체를 콜백 함수라 여겼다.

그 또한 온전히 이해가 가지않아 그러려니 하며 넘겼는데.

콜백 함수라는 것이 별것 아니었다는 것을 이제야 깨닫고 확실한 개념을 알았다.

좀 늦게 깨닫긴 했지만 JWT 강의를 보며 뜬금없이 전혀 상관 없는 궁금증이 생겨서 알아본것은 아래와 같다.

app.listen(5002, () => {
    console.log(5002, "번호로 서버가 켜졌어요!")
})

그렇다 여기에 있는 () => {} 이부분이 콜백 함수인 것이다.

간단히 말하자면 비동기 작업이나 이벤트가 완료 된 후에 실행되는 함수가 콜백함수

.listen 이라는 이벤트 메서드는 비동기 작업을 통하여 포트를 생성해주고 완료가 될시 함수를 실행시켜 준다.

그 함수를 콜백 함수라 한다.

 

도구들 사이에 지쳐있을때 잠시 힐링을 할 수 있는 수단인 회고였다.

자 이어서 JWT를 알아보도록 하겠다.

 

< README.md>

# history

1. yarn init -y
2. yarn add express jsonwebtoken
3. node jwt-test.js

 

< package.json >

{
  "name": "jwt-express",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "type": "module",
  "dependencies": {
    "express": "^4.19.2",
    "jsonwebtoken": "^9.0.2"
  }
}

 

< jwt-test.js >

import jwt from 'jsonwebtoken';

const token = jwt.sign({ myPayloadData: 9999 }, 'mysecretkey');
console.log(token);

// jwt PayLoad 복호화
const decodedValue = jwt.decode(token);
console.log(decodedValue);

// jwt 변조 검증
const decodedValueByVerify = jwt.verify(token, 'mysecretkey');
console.log(decodedValueByVerify);

 

1. jwt.sign() : 첫 파라미터는 payload, 두번째 파라미터는 signiture 이다.

 

2. jwt.decode() : 복호화를 할수있는 메서드이며  jwt.sign()으로 생성된 encoded를 복호화 알아볼 수 있는 형식으로
변환해준다.

 

3. jwt.verify() : 변조 검증은 JWT의 무결성과 신뢰성을 보장하는 데 중요하다.

만약 jwt.verify(페이로드, 서명)  서명이 jwt.sign(페이로드, 서명) 서명과 일치하지 않는다면

토큰이 변조되었거나 올바르지 않은 비밀 키로 서명되었음을 나타낸다.

 

< app.js >

import express from 'express';
import jwt from 'jsonwebtoken';
const app = express();
app.post('/login', function async (req, res, next) {
    const user = { // 사용자 정보
        userId: 203, // 사용자의 고유 아이디 (Primary key)
        email: "archepro00@gmail.com", // 사용자의 이메일
        name: "이용우" // 사용자의 이름
    }

    const userJWT = jwt.sign(user,
        'mysecretkey',
        {expiresIn: '1h' },
    );

    res.cookie('jwt-express', userJWT);
    return res.status(200).end();

    // res.cookie('sparta', user); // sparta 라는 이름을 가진 쿠키에 user 객체를 할당합니다.
    // return res.status(200).end();
});

app.listen(5002, () => {
    console.log(5002, "번호로 서버가 켜졌어요!")
})

 

1. jwt.sign() : 파라미터가 세번째까지 존재하는 경우  세번째 파라미터의 매개변수는 expiresIn 옵션으로

만료시간 설정 옵션이다. '1h', '5m' 이런식으로 설정할 수 있다.

이렇게 된 김에 옵션 몇 가지를 더 알아보겠다.

 

 - algorithm: 사용할 해싱 알고리즘을 지정합니다. 기본값은 HS256입니다.

 - expiresIn: 토큰의 만료 시간을 설정합니다. 예: '1h' (1시간), '2d' (2일), 3600 (3600초).

 - notBefore: 토큰이 유효해지기 시작하는 시간을 설정합니다. 예: '10m' (10분 후부터 유효),
1609459200 (유닉스 타임스탬프).

 - audience: 토큰의 수신자를 설정합니다.

 - issuer: 토큰을 발급한 주체를 설정합니다.

 - jwtid: JWT의 고유 식별자를 설정합니다.

 - subject: 토큰의 주제를 설정합니다.

 - noTimestamp: 토큰 생성 시간(iat)을 설정하지 않습니다.

 - header: 사용자 정의 헤더를 설정합니다.

작성은 아래와 같이 할 수 있다.

const token = jwt.sign(user, secretKey, {
    expiresIn: '1h', // 토큰 만료 시간
    notBefore: '10m', // 10분 후부터 유효
    audience: 'yourAudience', // 수신자
    issuer: 'yourIssuer', // 발급자
    jwtid: 'uniqueId', // JWT ID
    subject: 'userAuthentication', // 주제
    algorithm: 'HS256' // 해싱 알고리즘 (기본값)
});

 

2. res.cookie() : 주석 처리로 된 설명처럼 첫 파라미터는 쿠키 name 을 설정하고

두번째 파라미터는 값(value) 를 설정해줍니다. 위 코드같은 경우 value 설정을

user에 할당한 객체를 jwt.sign 을 통해 서명과 옵션을 같이 하여 암호화 시켜준 값을 넣어줬으며

세번째 파라미터도 아직 배우진 않았지만 아래와 같이 설정 가능하다.

res.cookie('jwt-express', userJWT, {
    httpOnly: true, // JavaScript로 쿠키 접근 불가
    secure: true, // HTTPS를 통해서만 전송
    maxAge: 3600000 // 1시간 후 만료 (밀리초 단위)
});

 

이렇게 해서 JWT 를 간단하게 배워 보았다.

아직 실용적인 프로젝트를 시작하지 않다 어떤식을 코드를 실행하는지 개념이 덜잡혀서 온전히 내것이 아닌

붕 떠있는 느낌이지만 이후 강의 게시판 프로젝트를 통해 차근차근 알아가 보도록 하겠다.