Skip to content

Instantly share code, notes, and snippets.

@koo6357
Last active September 1, 2022 08:48
Show Gist options
  • Save koo6357/88fd80afe499c8be9cc7704b329219c6 to your computer and use it in GitHub Desktop.
Save koo6357/88fd80afe499c8be9cc7704b329219c6 to your computer and use it in GitHub Desktop.
JWT - RSA256

JWT

RSA256 알고리즘 - 비대칭키 암호

엄청 큰 숫자는 소인수분해하기가 힘들다는 것을 이용한다.

아래 설명은 개인적으로 이해한 뇌피셜의 표현이다.

6 = 2 x 3;

6을 무엇인가로 나눠서 3이 나오기 위해서는 2여야만한다.

6을 무엇인가로 나눠서 2이 나오기 위해서는 3여야만한다.

한다는 소인수분해에 관한것이다.

토큰 = privateKey x publicKey의 개념인것이다.

RSA256은 그 크기가 256바이트란 뜻인데, 4바이트가 2의 32승의 크기라고 한다면 얼마나 큰수인지 알수 있다.

그러한 크기의 소수의 곱으로 이루어진 토큰이다.

저 토큰을 분해 하기 위해선 privateKey 과 publicKey의 한쌍이 필요하다.

그래서 auth 서버가 privateKey로 JWT token을 발행한다면 그것의 내용을 확인하기 위해선 publicKey가 필요한것이다.

이로써 발행 주체인 auth 서버만 privateKey를 소유하며 클라이언트나 다른 API server는 publicKey만 소유 하고 그것을 통하여 암호화된 정보를 열어볼수 있다.

누군가가 public키를 통하여 JWT token을 만들어 호출을 하여도 API 서버 에서는 publicKey 그것을 확인하려고 함으로써 실패하게 된다.

JWT example

RSA Key Pair를 생성한다.Online RSA Key Generator

const jwt = require('jsonwebtoken');

const privateKey = `-----BEGIN RSA PRIVATE KEY-----
                    MIIEowIBAAKCAQBw4GJEqR+3qtfwCMIaVyxbT38lo8hvMwxBlCA8kMzY5b5aEx+J
                    a1BfpY3w4MsZsfdRZTYYzyA8oMdLdRWGkuhml6nb2+1PwGhTa88KS9oOCwxVwL4x
                    g7kNHv4apQl88hdWfGDIP/1PGdpJ8ou9rtfBwvPYdfd0MZpE9sO8VVUvEJrzrQPu
                    ZcLJ8gMO/Bn1/Sptv7AgufwN1jLXua6K84XhJeFqRkY1s9RiSArysfov1tJz3kcT
                    BPXJyoovoJPoEu1AJi/N3Q0UfVzyGZnABwQNQDC4iERiEf0Uaa0OPHHg2Ko8WUWU
                    gI2yu5OWRIyfSPzwLnpZyVPtwnqyiYqadrPZAgMBAAECggEAblREeQw+Pk41Rx+o
                    agqvBolLpETUkyx4XFkmsUxvjcnyJyTt/GnyY6r0dG+k1XbIYLznBZTe06PraOwG
                    oEVT94Niuc3bxcoxruh/tHazqmpOIjuFK+yuog6bHPwXrBMNkLF9//3b4MdKQGFd
                    CYiux2uA4SFdQCuDuMjiRWG7I4ZrxTTt5xWywVeO5FWEiybYiwKmzFOS/tCvQggR
                    pANNg22RahmACAh7V6G4dlW3IscMsoOejOo+aPVrEnCK7++13zKPp4/Y41FzdslZ
                    8dW4kBeS1EOckzMYjgaElSSRLuztRgQml3il+6DakbSi8YHWMRzRYO8pO5GNQRx4
                    yWmMAQKBgQDLxpul8qPqI82rUgfw/OWV35WClrBLZTCXMVz849YhCCsrJuC5R9oT
                    xaAusvfKmcyka0EUGZ33nXHhjESjU6IcL0W7CTxzfvM4COgunPpj0dAjOfZFRdCE
                    +4+zRG4X+J2/r/wENWLOxthL9oth1ydmVamwvkdvF5XLJiT4/JvMmQKBgQCNzgXu
                    3C3u1zlnF7W5oZkMVdncBGXA28ks7F+SmcFRu+W6RNsPOphRdMqk+pLAceE6HtUo
                    /0QNHWiWkzcen8u6H4KBgALy8k1dOAvbjN/v0yXN55nyKrdIiSMt0IPv9QrGaMZb
                    kLjnQoCBJ06/u/SCpl4wRHTE5QerAYD5uQVpQQKBgQCHeSitcNzMorTvOwAQlPFF
                    bHmHcgsOdN2TBrxdXFNVborUi2pHg59WGcLeiRj31rwYaz2+0TEWF9RIMOrI8qcJ
                    udvP9tn7puCn1jQWGULV7f1EDhrN/xYb8uqcMdhHk3+8mpEfcyaXddcC2Yvcph+J
                    h1XjLP1su+9YOanG5pnlsQKBgGWm/tHPvI2uc1PXx0me8hvJnzb9YAP0ii5N8+Uf
                    m1mAHJp+qZotIuuhkXLavUB/YjlLyPpuotXT8xmdxrGJU33FAMTcg0CtOZBNkRJ9
                    1joRXtRP5ieXP3Qb+r/o7euh+WtpyGfzQtlk7sGm7+i6T/koUfS/3gUXOXv4xABA
                    BgUBAoGBAKDQwqG3YhfU0j7NQ0cdnDHy4dDDwbYm5KRDUO+c8qD0ouoalQMOaAqb
                    dgRp1H4xGhrwO7q8RFBz5WgueQoI8wut4G7gzIXLbQfaA49BSMXiJHAmpCXCxpAx
                    k3Dari2ea78cscnQtbjhnfisRvoEhp4P2EhqCJ1xciZcd+wfI5WU
                    -----END RSA PRIVATE KEY-----`;

const publicKey = `-----BEGIN PUBLIC KEY-----
                   MIIBITANBgkqhkiG9w0BAQEFAAOCAQ4AMIIBCQKCAQBw4GJEqR+3qtfwCMIaVyxb
                   T38lo8hvMwxBlCA8kMzY5b5aEx+Ja1BfpY3w4MsZsfdRZTYYzyA8oMdLdRWGkuhm
                   l6nb2+1PwGhTa88KS9oOCwxVwL4xg7kNHv4apQl88hdWfGDIP/1PGdpJ8ou9rtfB
                   wvPYdfd0MZpE9sO8VVUvEJrzrQPuZcLJ8gMO/Bn1/Sptv7AgufwN1jLXua6K84Xh
                   JeFqRkY1s9RiSArysfov1tJz3kcTBPXJyoovoJPoEu1AJi/N3Q0UfVzyGZnABwQN
                   QDC4iERiEf0Uaa0OPHHg2Ko8WUWUgI2yu5OWRIyfSPzwLnpZyVPtwnqyiYqadrPZ
                   AgMBAAE=
                   -----END PUBLIC KEY-----`;

const token = jwt.sign({
    email: 'koo@google.com',
    exp: Math.floor(Date.now() / 1000) + (60 * 60),
}, privateKey, { algorithm: 'RS256'});
console.log("@@ token", token);
// token eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Imtvb0Bnb29nbGUuY29tIiwiZXhwIjoxNTcxMjA3Njk2LCJpYXQiOjE1NzEyMDQwOTZ9.YW-eQ1GqcCLE6MCaGn6JWOxYQnjdrzk-TEN3mvLhEUS2B6xqB106b22mPX6uPbS1QnXSeWzeGgpA3rHMf0dJtsH-pQWxf2zj0afannfeAcFpcHFUMR7G-wLUI-n6SfMBOQ8RTunBabY_hrhZ9Zx6lFOR339-uV4T7A_kj49EjeQ

function jwtDecode(token) {
    return jwt.decode(token, { complete: true });
}

const decodedAuth = jwtDecode(token);
console.log("@@ decodedAuth", decodedAuth);
// decodedAuth { 
      header: { alg: 'RS256', typ: 'JWT' },
      payload: { email: 'koo@google.com', exp: 1571207696, iat: 1571204096 },
      signature: 'YW-eQ1GqcCLE6MCaGn6JWOxYQnjdrzk-TEN3mvLhEUS2B6xqB106b22mPX6uPbS1QnXSeWzeGgpA3rHMf0dJtsH-pQWxf2zj0afannfeAcFpcHFUMR7G-wLUI-n6SfMBOQ8RTunBabY_hrhZ9Zx6lFOR339-uV4T7A_kj49EjeQ' 
  }


const validAuth = jwt.verify(token, publicKey, {
    algorithm: ['RS256'],
});

console.log("@@ validAuth", validAuth);
// validAuth { email: 'koo@google.com', exp: 1571207696, iat: 1571204096 }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment