티스토리 뷰

프로그래밍 기초/CS

JWT란?

StartCoriny 2024. 2. 14. 22:11

JWT(Json Web Token)란?

  • 두 당사자 간의 청구를 JSON개체로 안전하게 전송하기 위한

    간결하고 독립적인 방법을 정의하는 개방형 업계 표준 RFC7519방법입니다.

  • 이 정보는 디지털 서명이 되어 있으므로 확인하고 신뢰할 수 있는 정보입니다.

  • JWT는 공개 / 개인 키 쌍을 사용하여 서명할 수 있습니다.

  • 서명된 토큰은 그 안에 포함된 청구의 무결성을 확인할 수 있는 반면,

    암호화된 토큰은 이러한 청구를 다른 당사자로부터 숨깁니다 .

  • 공개/개인 키 쌍을 사용하여 토큰에 서명하는 경우,

    서명은 개인 키를 보유하고 있는 당사자만이 서명한 사람임을 인증 할 수 있습니다.

 

 

JWT (Json Web Token)는 언제 사용 하는가?

● 승인

   • JWT를 사용하는 가장 일반적인 경우입니다.

   • 사용자가 로그인하면 각 후속 요청에 JWT가 포함되어 사용자가 해당 토큰으로 허용되는 경로,

     서비스 및 리소스에 액세스 할 수 있습니다.

   • Single Sign On 기능은 오버해드가 적고 다양한 도메인에서 쉽게 사용할 수 있다는 점 때문에 JWT를 많이 사용합니다. 

 

● 정보교환

   • JSON 웹 토큰은 당사자 간에 정보를 안전하게 전송하는 좋은 방법입니다.

   • 공개/개인 키 쌍을 사용하여 JWT에 서명할 수 있으므로 보낸 사람이 누구인지 확인할 수 있습니다.

   • 헤더와 페이로드를 사용해 서명을 계산하므로 콘텐츠가 변조되지 않았는지 확인할 수도 있습니다.

 

 

JWT 구조

(왼쪽 - 인코딩된 JWT) (오른쪽 - 디코딩된 JWT) 색별로 헤더, 내용, 서명을 구분할수 있다.

HEADER (헤더) . PAYLOAD(내용) . VERIFY SIGNATURE(서명) 이 .(DOT) 형식으로 구분하여 JWT 토큰 1개를 이룹니다.

 

HEADER - 헤더

{
  "alg": "HS256",
  "typ": "JWT"
}

해시 알고리즘과 토큰ㅇ의 타입을 정의 할 수 있습니다.

HS256은 HMAC SHA 256, 해시 알고리즘 중 한가지를 의미하고

JWT는 이 토큰을 JWT로 지정하겠다는 의미입니다.

 

PAYLOAD - 내용

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

전달하는 데이터를 포함할 수 있습니다. 대표적으로 개발자가 원하는 데이터를 저장합니다.

PAYLOAD는 서명된 파트가 아니고 단순 Base64인코딩된 파트이므로 누구나 디코딩(복호)하여 열람이 가능합니다.

때문에 password같은 결정적인 요소들은 PAYLOAD에 포함해서는 안됩니다.

 

VERIFY SIGNATURE - 서명

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret
)

secret = 유저가 지정하는 비밀 코드

서명 파트는 Base64인코딩된 HEADER "." PAYLOAD, SECREAT이 필요합니다.

이렇게 해싱을 하게되면 서명이 완성됩니다.

 

json 데이터 암호화

const token = jwt.sign({ myPayloadData: 1234 }, "mysecretkey");
console.log(token);
// eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJteVBheWxvYWREYXRhIjoxMjM0LCJpYXQiOjE3MDYyNDYzMjl9.Td3-XRPvIdtO5uVbaT8foA8-ROFQM5DxpjSixWwCow0

위처럼 출력해 보면 . 을 기준으로 HEADER . PAYLOAD . VERIFY SIGNATURE 로 인코딩되어 나오는걸 확인 할 수 있습니다.

 

코드로 복호화

const decodedValue = jwt.decode(token);
console.log(decodedValue);
// { myPayloadData: 1234, iat: 1706246329 }

보면 객체 형태로 내용이 나오는걸 확인 할 수 있는데 'mysecretkey'라고 적힌게 사라지고 iat : 1706246329 이 출력되는걸

확인 할 수 있습니다.

이걸로 확인 할수 있는것이 비밀키를 몰라도 누구나 복호화를 할수 있다는 것입니다.

그리고 뒤에 나오는 iat는 라이브러리에 의해 자동으로 추가되며 토큰이 발급된 타임스탬프를 나타냅니다.

 

변조되지 않은 데이터인지 검증

const decodedValuebyVerify = jwt.verify(token, "mysecretkey");

// 잘못된 비밀키를 입력한다면 검증에 실패하여 에러 발생!
// const decodedValuebyVerify = jwt.verify(token, "secretkey"); 

console.log(decodedValuebyVerify);

// 검증 성공시
// { myPayloadData: 1234, iat: 1706246329 }

// 검증 실패시
// JsonWebTokenError: invalid signature

jwt의 verify메서드를 사용하여 올바른 비밀키로 서명되었는지 확인하고 올바른키인것으로 확인이 된다면

데이터가 잘 나오지만

 

만약 실패한다면

에러가 뜨게 됩니다.

'프로그래밍 기초 > CS' 카테고리의 다른 글

동시성문제와 격리수준에 대해서  (0) 2024.02.20
Access Token 과 Refresh Token  (0) 2024.02.16
쿠키(Cookie)와 세션(Session)  (0) 2024.02.13
JWT 사용자 인증 미들웨어  (0) 2024.01.27
REST API란?  (0) 2024.01.23
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함