본문 바로가기
NodeJS

JWT로 권한 인증하기

by 개발자doc 2024. 6. 23.
목차
1. JWT란?
2. 토큰의 유형
3. 어떻게 생겼을까?
4. 토큰 생성
5. 쿠키를 사용한다고?
1. JWT란?
  • Json Web Token
  • 권한 인증을 위해 유저의 정보를 SHA-256 해시알고리즘으로 암호화한 값으로 권한인증을 하는 토큰 기반 인증 방식

기존의 권한인증은 세션 정보를 서버에 저장하여 사용자가 요청할 때 헤더에 포함된 세션을 비교하여 인증을 하는 방식이였다. 하지만 이는 세션 정보가 많아짐에 따라 서버에 부담을 줄 수 있다. 하지만 토큰은 서버가 아닌 클라이언트가 토큰을 가지고 있도록 하여 서버에 부담을 줄여줄 수 있다. 

2. 토큰의 유형

토큰은 사용 목적에 따라 2가지가 있다.

  • Access Token

▶ 서버에 통신할 때 권한 인증을 위해 사용되는 토큰으로 짧은 유효시간을 갖는다. 유효시간이 짧다고 해서 무조건 계속 로그인을 해주어야 하는 것은 아니고 이미 인증이 된 사용자라면 Refresh token에 의해 계속 token을 재발급받는다. 

 

  • Refresh Token

Access Token을 재발급하기 위한 토큰으로 며칠, 몇 개월 단위로 유지된다. Access Token이 만료되었을 때 Refresh token에 의해 재발급이 된다. 하지만 Refresh token도 만료가 되면 반드시 다시 권한 인증을 위해 로그인을 해야 한다. 

3. 어떻게 생겼을까?

토큰은 header, payload, signature로 나누어지며 "."으로 구분된다.

header payload signature
타입과 암호 알고리즘의 정보 검증할 유저의 정보 및 발금,만료시간 등을 포함 전자서명

 

4. 토큰 사용하기

토큰은 외부 모듈이므로 설치를 해야 사용이 가능하다.

1 ) 토큰 생성

토큰에는 패스워드 등의 민감한 정보 대신 유저의 ID나 이름같이 유출이 되도 크게 상관이 없는 정보를 포함시키는 것이 좋다.

또한 토큰을 생성할 때 필요한 비밀키는 본인만 알아야하기에 환경변수로 저장하여 사용하는 편이 좋다.

const jwt = require("jsonwebtoken");
const key = "비밀키";
jwt.sign({
    type: "JWT",
    name: "kim"
}, key, {
    expiresIn: "5m",
    issuer: "발급자"
});

 

2 ) 토큰 복호화

const jwt = require("jsonwebtoken");
const token = "복호화할 토큰값";
const key = "비밀키";
jwt.verify(token, key);

 

5. 쿠키를 사용한다고?

JWT는 쿠키에 암호화한 토큰값을 저장하고 요청을 했을 때 해당 토큰을 검증하여 사용자의 권한 유무를 판별한다. 그런데 정보가 유출될 수 있다는 쿠키를 사용한다니? 뭔가 문제가 있어보인다. 쿠키를 조작하여 토큰을 변조하게 되면 정상적인 사용자라도 문제가 생길 수 있다.

하지만 브라우저에서 해당 토큰을 다루지 못하게 하는 방법이 있다.

res.cookie("token", token, { httpOnly: true });

서버에서 토큰을 발급하여 쿠키에 저장하여 응답할 때 httpOnly라는 옵션을 true로 지정하면 요청과 응답에만 사용하고 클라이언트가 직접 토큰을 조작할 수 없다.

'NodeJS' 카테고리의 다른 글

웹소켓  (0) 2024.06.30
Sequelize  (0) 2024.06.29
내 비밀번호 나도 모르게 만드는 법 bcrypt  (0) 2024.06.22
cors  (0) 2024.06.21
form태그로 REST FUL 가능할까?  (0) 2024.06.15