HS256 알고리즘은 JWT 토큰의 암호화 알고리즘으로 많이 쓰이는 암호화 알고리즘 입니다. 앞에서 HS256에서 S256은 SHA256 을 의미한다고 했습니다. H는 무엇일까요? HMAC 알고리즘을 의미합니다. HMAC 알고리즘은 대칭키 암호화 알고리즘입니다.
HS256 = HMAC + SHA256
서버에서 Header, Payload 는 Base64로 인코딩된다. (참고로, Base64 알고리즘은 복호화가 되는 알고리즘입니다.)
Signature 는 "Header + Payload + secret 값" 을 HS256 알고리즘으로 암호화됩니다.
생성된 Header, Payload, Signature 로 JWT 토큰을 만들어 클라이언트로 보내고, 클라이언트는 로컬 스토리지에 토큰을 저장합니다.
클라이언트는 서버에 요청이 있을 경우, 토큰과 요청 내용을 같이 보냅니다.
서버에서는 Header 와 Payload 를 Base64 알고리즘으로 복호화한 뒤, 서버만 알고 있는 개인키를 가지고 다시 HS256 알고리즘을 이용해 암호화해보고, 클라이어트에서 보낸 토큰과 같은지 유효성 검증을 합니다.
그리고, RS256에 대해 알아보겠습니다. RS256에서 R은 RSA 를 의미합니다. RSA 알고리즘은 비대칭키 암호화 알고리즘입니다. 비대칭키 암호화 알고리즘은 공개키(public key)와 개인키(private key)를 이용해 암호화를 진행합니다. 그리고 RS256 알고리즘은 HS256 과는 달리, secret 값이 따로 필요하지 않다.
RS256 = RSA + SHA256
서버에서 Header, Payload 는 Base64로 인코딩된다. (참고로, Base64 알고리즘은 복호화가 되는 알고리즘입니다)
Header, Payload는 서버의 개인키로 암호화 Signature 를 만듭니다.
그리고 토큰을 만들어 클라이언트에 보냅니다.
클라이언트는 서버에 요청을 보낼 때 토큰과 요청 내용을 같이 보냅니다.
서버에서는 토큰의 유효성 검증을 하기 위해서, 공개키로 Signature 를 복호화해봅니다.
http://wiki.hash.kr/index.php/SHA256
https://namu.wiki/w/%ED%95%B4%EC%8B%9C
https://velog.io/@octo__/SHA256-%ED%95%B4%EC%8B%9CHash-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0
https://community.auth0.com/t/rs256-vs-hs256-jwt-signing-algorithms/58609
https://velog.io/@ddangle/JWT-%ED%86%A0%ED%81%B0-%EC%95%94%ED%98%B8%ED%99%94-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-HS256%EA%B3%BC-RS256