포시코딩

JWT 본문

Node.js

JWT

포시 2022. 12. 19. 14:38
728x90

JWT란?

  • JSON 형태의 데이터를 안전하게 교환하여 사용할 수 있게 해준다.
  • 인터넷 표준으로 자리잡은 규격
  • 여러가지 암호화 알고리즘을 사용할 수 있다.
  • header.payload.signature의 형식으로 3가지의 데이터를 포함한다.
    때문에 JWT 형식으로 변환된 데이터는 항상 2개의 점(.)이 포함된 데이터여야 한다.
  • JWT는 암호 키(Secret Key)를 모르더라도 복호화(Decode)가 가능하다.
    변조만 불가능 할 뿐, 누구나 복호화하여 보는 것은 가능하다는 의미
  • 누구나 볼 수 있기 때문에 민감한 정보(개인정보, 비밀번호 등)는 담지 않도록 해야한다.
  • 특정 언어에서만 사용 가능한게 아니다. 
    개념으로서 존재하고, 이 개념을 코드로 구현하여 공개된 코드를 우리가 사용하는게 일반적.

  • header: signature에서 어떤 암호화를 사용하여 생성된 데이터인지 표현한다.
  • payload: 개발자가 원하는 데이터를 저장한다.
  • signature: 이 토큰이 변조되지 않은 정상적인 토큰인지 확인할 수 있게 도와준다.

 

쿠키, 세션과 다른 점

  • 데이터를 교환하고 관리하는 방식인 쿠키/세션과 달리, JWT는 단순히 데이터를 표현하는 형식이다.
  • JWT로 만든 데이터를 브라우저로 보내도 쿠키처럼 자동으로 저장되지 않지만, 
    변조가 거의 불가능하고 서버에 데이터를 저장하지 않기 때문에 서버를 Stateless(무상태)로 관리할 수 있고
    최근 많이 쓰이는 기술 중 하나이다.
  • Stateless(무상태)Stateful(상태 보존)의 차이를 간단히 설명하자면,
    • Node.js서버가 언제든 죽었다 살아나도 똑같은 동작을 한다. -> Stateless
    • 반대로 서버가 죽었다 살아났을 때 조금이라도 동작이 다르다. -> Stateful
  • 서버가 스스로 어떤 기억을 갖고 다른 결정을 하냐 마냐의 차이로 이해하면 쉽다.
  • 로그인 정보를 서버에 저장하게 되면 무조건 Stateful(상태 보존)이라고 볼 수 있다.

 

사용법

암호화

오픈소스 라이브러리를 이용한다.

npm install jsonwebtoken
const jwt = require('jsonwebtoken');

const token = jwt.sign(
  { myPayloadData: 1234 },	// jwt를 이용해 payload 설정하는 부분
  "myscretkey"			// jwt를 이용해 암호화를 하기 위한 비밀키
  );
console.log(token);

app.listen(8080, () => {
  console.log("서버가 켜졌어요!");
});
// eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJteVBheWxvYWREYXRhIjoxMjM0LCJpYXQiOjE2NzE0MjY1Njd9.0kkhNtiuMhZUknpcyRsSJsc17nak4l5FWIKzQ-UqLt8

출력된 token을 https://jwt.io/에 가서 입력해보면 아래와 같이 나오게 된다.

이 상태로 우측하단 your-256-bit-secret 부분에 아까 만든 비밀키를 입력하면 

암호화 키 인증까지 검증할 수 있다.

 

복호화

const decodeToken = jwt.decode(token);  // jwt의 payload를 확인하기 위해 사용한다.
console.log(decodeToken);
// { myPayloadData: 1234, iat: 1671426989 }

 

만료기간 설정

const token = jwt.sign(
  { myPayloadData: 1234 },
  "mysecretkey",
  { expiresIn: "1s" }  // 1초. (String도 가능)
);

 

데이터 검증

const verifyToken = jwt.verify(token, "mysecretkey");  
// 잘못된 키라면 invalid signature라는 에러가 발생한다.

키가 다를 경우 invalid signature 에러가 발생한다.
만료기간이 지났을 때도 jwt expired라는 에러가 발생하는 것을 볼 수 있다.

  1. 암호화를 할 때 사용한 비밀키가 일치하는지 검증
  2. 해당하는 jwt가 만료되었는지 검증

 

정리

보통 암호화된 데이터는 클라이언트(브라우저)가 전달받아 다양한 수단(쿠키, 로컬스토리지 등)을 통해
저장하여 API 서버에 요청을 할 때 서버가 요구하는 HTTP 인증 양식에 맞게 보내주어 인증을 시도한다.

 

  • 특정 사용자가 누구인지 확인하기 위해
  • 특정 사용자의 대한 권한을 할당하기 위해

결론적으로 사용자에 대한 특별한 정보를 관리하기 위해 많이 사용한다. 

728x90