본문 바로가기
깃허브 링크!
node.js

node.js 접근 토큰과 갱신 토큰 발급

1. package.json

2. 서버 객체 만들고

3. 서버 대기 상태

4. view engine 경로 설정

5. view engine ejs 사용

6. body 객체 사용

 

// 오늘 사용할 모듈

// dotenv express cookie-parser jsonwebtoken

const express = require("express");
const path = require("path");
const app = express();
const dot = require("dotenv").config()
const jwt = require("jsonwebtoken")

const port = 8000;
app.listen(8000,()=>{
    console.log("server open");
});

app.set("views",path.join(__dirname,"page"));
app.set("view engine","ejs");
app.use(express.urlencoded({extended:false}))// 6. body 객체 사용
// 더미로 회원가입 한사람의 정보 객체
const user = {
    id : "shin",
    password: "123"
}

app.get('/',(req,res)=>{
    res.render("login");
})

app.post("/login", (req,res)=>{
    // 요청 객체의 body에 user_id랑 user_pw
    const{user_id, user_pw}= req.body;
    if(user_id === user.id && user_pw === user.password){
        // access token 발급
        const accessToken = jwt.sign({
            id : user.id
        },process.env.ACCESS_TOKEN_KEY,{
            expiresIn : "20s",

        });
        const refreshToken = jwt.sign({
            id : user.id
        },process.env.REFRESH_TOKEN_KEY,{
            expiresIn : "1d",
        })

        res.cookie("refresh",refreshToken,{maxAge :24 *60 *60 * 1000 })
        res.render("join",{accessToken});
    } 
})

코드 한줄한줄 내용정리

1. express와 path 모듈을 불러온다.

2. express 애플리케이션을 생성하고 app 변수에 할당

3. dotenv 모듈을 사용하여 환경 변수를 로드

4. jsonwebtoken 모듈을 불러온다.

5. 포트 번호를 8000으로 설정하고 애플리케이션을 해당 포트에서 실행

6. 뷰 템플릿을 사용하기 위해 views 경로와 뷰 엔진을 설정

 

 

7. express.unlencoded() 미들웨어를 사용하여 요청의 본문(body)를 파싱 =>(key-value 형태의 데이터를 추출)

웹 애플리케이션에서 폼 데이터를 전송할 때, 일반적으로 URL 인코딩된 형식으로 데이터를 전송합니다.
예를 들어, 사용자가 로그인 폼에서 아이디와 비밀번호를 입력하고 제출하면, 
이 데이터는 URL 인코딩된 형식으로 서버에 전송됩니다.

express.urlencoded() 미들웨어는 이러한 URL 인코딩된 데이터를 받아서 자동으로 파싱하여
요청 객체(req)의 body 속성에 저장해줍니다.
즉, 이 미들웨어를 사용하면 개발자는 별도의 파싱 로직을 작성하지 않고도
요청 데이터를 쉽게 사용할 수 있습니다.

예를 들어, 사용자가 로그인 폼에서 아이디와 비밀번호를 입력하고 제출하는 경우, 
이 데이터는 URL 인코딩된 형태로 전송됩니다. express.urlencoded() 미들웨어를 등록하면,
Express 애플리케이션은 자동으로 이 데이터를 받아서 파싱합니다.
그리고 파싱된 데이터는 req.body라는 객체에 저장됩니다.

따라서, 이후에 라우터 핸들러에서 req.body를 통해
사용자가 입력한 아이디와 비밀번호 등의 데이터에 접근할 수 있게 됩니다. 
이를 통해 개발자는 폼 데이터를 처리하기 위한 별도의 파싱 로직을 작성하지 않아도 됩니다.

** url 인코딩이란??

URL 인코딩은 웹에서 특수 문자나 공백 등의 문자를 안전하게 전송하고 처리하기 위해 사용되는 방식입니다.

URL은 인터넷 상에서 리소스의 위치를 나타내는 주소이며, 
일부 문자는 URL에서 특별한 의미를 갖거나 URL의 형식을 깨트릴 수 있습니다.
예를 들어, URL에 공백이나 한글 문자가 포함되는 경우 문제가 발생할 수 있습니다.
URL 인코딩은 이러한 특수 문자나 공백을 안전하게 전송하기 위해
해당 문자들을 특별한 형식으로 인코딩하는 방법입니다.

URL 인코딩은 문자를 % 기호와 그 뒤에 두 자리 16진수 값으로 대체하여 표현합니다.
예를 들어, 공백은 %20으로 인코딩되고, 
한글 문자 "안녕"은 %EC%95%88%EB%85%95와 같이 인코딩됩니다.

 

8. user 객체를 생성하여 더미 회원 정보를 가지고 있다.

9. 루트 경로("/")에 대한 get 요청이 들어오면 "login"뷰를 렌더링

10. "/login"경로에 대한 post 요청이 들어오면 사용자가 입력한 ID와 비밀번호 확인

11. 입력한 ID와 비밀번호가 user 객체의 정보와 일치하면 접근 토큰 (access token)과 갱신 토큰(refresh token)을 발급

12. 발급한 갱신 토큰을 쿠키에 저장하고 join 뷰를 렌더링

 

이는 로그인 기능을 구현한 예시 코드로 요청된 ID와 비밀번호가 더미 회원 정보와 

일치하는 경우에만 접근 토큰과 갱신 토큰이 발급되고 join 뷰를 보여준다.

 

----------------- 추가 설명

jwt.sign() 메소드를 사용하여 토큰을 생성합니다. 이 메소드는 세 개의 매개변수를 받습니다.

토큰에 포함될 데이터를 담은 객체입니다.
위의 코드에서는 { id: user.id }로 사용자의 ID를 토큰에 포함시키고 있습니다.
토큰을 서명하기 위한 비밀 키입니다. process.env.ACCESS_TOKEN_KEY 
및 process.env.REFRESH_TOKEN_KEY는 환경 변수에 저장된 키를 사용하고 있습니다.
토큰의 유효 기간을 설정하는 옵션입니다. expiresIn을 사용하여 토큰의 유효 기간을 설정합니다.
"20s"20초를 나타내며, "1d"1일을 의미합니다.
위의 코드에서는 두 번의 jwt.sign() 메소드 호출을 통해 접근 토큰과
갱신 토큰을 각각 생성하고 있습니다.
accessToken 변수에는 접근 토큰이 할당되고, refreshToken 변수에는 갱신 토큰이 할당됩니다.

토큰은 사용자의 ID를 포함하고 있으며,
지정된 기간 동안 유효합니다.
이러한 토큰은 사용자 인증과 같은 보안 기능을 구현하는 데 사용될 수 있습니다.

** process.env.ACCESS_TOKEN_KEY

사용하는 이유는 내가 '신근호' 이렇게 요청을 보내면 이걸 암호화시켜서 해킹방지를 위함이라고 생각하면 됨

 

 

 

 

 

env 파일

ACCESS_TOKEN_KEY = sdfahdbdc
REFRESH_TOKEN_KEY = pofjpsokjd

 

 

 

------- 진행 

refresh 발급이유:

일반적으로 접근 토큰은 유효 기간이 짧게 설정되어 있어서
보안 상의 이유로 자주 갱신되어야 합니다. 
유효 기간이 짧은 접근 토큰을 사용하면 토큰이 탈취되더라도
악용될 수 있는 기간을 최소화할 수 있습니다.
그러나 매번 사용자의 인증을 요청하고 새로운 접근 토큰을 발급받는 것은 비효율적이고
부담스러울 수 있습니다.

이런 경우, 갱신 토큰을 사용하여 접근 토큰을 갱신할 수 있습니다. 
사용자가 로그인한 후, 접근 토큰과 함께 갱신 토큰도 발급되고,
갱신 토큰은 긴 유효 기간을 가지게 됩니다.
접근 토큰이 만료되면 갱신 토큰을 서버에 제출하여 검증하고, 
유효한 경우 새로운 접근 토큰을 발급받을 수 있습니다.
이렇게 접근 토큰을 주기적으로 갱신함으로써 
사용자는 로그인 상태를 유지하면서도 보안을 유지할 수 있습니다.

따라서 갱신 토큰은 접근 토큰의 유효 기간이 만료되었을 때,
사용자를 다시 인증하지 않고도 접근 토큰을 갱신할 수 있는 기능을 제공하여
사용자 경험을 향상시키고, 보안을 강화하는 역할을 합니다.

------------------

 

주어진 데이터는 'refresh'라는 키와 그에 대응하는 값으로 구성된 JSON 객체입니다.
값은 문자열로 보이며, 이는 JWT(JSON Web Token)입니다.
JWT는 클라이언트와 서버 간에 안전하게 정보를 전달하기 위해 사용되는 인증 및 인가 메커니즘입니다.
JWT는 주로 사용자 인증에 사용되며, 
액세스 토큰이나 갱신 토큰과 같은 인증 정보를 포함할 수 있습니다.
이 JWT를 해독하려면 해당 토큰의 비밀 키를 사용해야 합니다.