본문 바로가기
개발 지식/Backend

[JWT] 서명을 위한 알고리즘 HS256과 RS256

by 에르주 2021. 10. 11.
반응형

JWT를 정리하다보니 JWT에 주로 사용되는 암호화 알고리즘 HS256과 RS256에 대해 언급이 필요할 것 같아 정리를 한다.
암호화 알고리즘 내 자세하고 복잡한 암호화 로직이 있지만 그 부분은 다음,, 언젠가 글로 남기기로 하고
지금은 2가지 알고리즘이 어떠한 프로세스를 가지고 있는지 정리하고자 한다.

1. HS256 (HMAC with SHA-256)

우선 클라이언트와 서버간 또는 서버 대 서버간 메시지를 주고 받았을 때 변조여부를 확인해야 한다. 원본 메시지와 공유된 메시지를 비교하여 변조 여부를 확인하는 것이 MAC(Message Authentication Code)이다.

여기서 HS256의 HMAC의 의미는 다음과 같다.

HMAC (Hash based Message Authentication Code = Hash(Message, Key) + Message
// 여기서 Hash 함수는 SHA1, SHA2등의 알고리즘 사용

-> 해싱과 공유키를 이용한 MAC가 HMAC이다.


즉 HMAC는 원본 메시지가 변하면 그 해시값도 변하는 해싱(Hashing)의 특징을 활용하며 메시지의 변조 여부를 확인하여 무결성 및 기밀성을 제공하는 기술이다.

한마디로 표현하자면 대칭키를 이용한 알고리즘이다. (A symmetric algorithm)
2개 이상의 영역에서 키 값이 공유된다. (예를 들자면 Frontend와 Backend 또는 서로 다른 도메인의 API)

중요한 부분은 하나의 키를 이용하여 서명을 하므로 키 값이 손상되지 않도록 주의해야 한다.
: 키 값을 하드코딩으로 코드에 넣기 보다는 Spring으로 따지면  application.yml과 같은 문서 파일에 보관 하는 것을 권장한다.


전체적인 흐름은 다음과 같다.

전체적인 Flow

 

  1. A Service, B Service 모두 Key값을 공유한다. : 해당 그림에는 Erjuer
  2. A Service에서 Message("Hello World")를 Key(Erjuer)으로 Hashing 한다.
  3. A Service에서 2번의 결과값과 Message를 B Service로 전달한다.
  4. B Service에서는 A Service에서 받는 Message를 본인이 가지고 있는 Key값으로 Hashing 한다.
  5. B Service에서 Hashing 한 값과 A Service에서 받은 Hash값이 같으면 그 Message 값을 신뢰한다.

 

2. RS256 (RSA Signature with SHA-256)

RSA Signature 알고리즘은 An asymmetric algorithm, 비대칭형 알고리즘이다.
즉 공개키(Public Key)와 개인키(Private Key) 2개의 키를 활용한다.

전체적인 흐름을 살펴보자.

공개키 / 개인키 암호화 프로세스

 

  1. A Service에서 공개키(Samsung)와 개인키(Apple)을 생성한다. : 공개키로 암호화한 암호문은 개인키로 풀 수 있다.
  2. B Service에서 공개키를 요청한다.
  3. A Service에서 B Service로 공개키를 전달한다.
  4. B Service는 Message(Korea)를 A Service에서 전달 받은 공개키(Samsung)으로 암호화한다.
  5. A Service로 암호화된 값을 전달한다.
  6. A Service는 암호화된 값을 개인키(Apple)로 복호화 한다.
  7. Message가 Korea 임을 확인한다.


공개키 / 개인키 암호화 복호화 프로세스는 위 그림과 같다.
여기서 공개키로 암호화 한 암호문은 개인키로 풀 수 있는데
여기서 중요한 점은 개인키는 절대로 밖에 오픈해서는 안되며 공개키로 개인키를 알아 낼 수 없어야 한다.

RSA Signature라고 하는 것은 공개키 개인키를 생성에 RSA 알고리즘이 사용한다는 것이며 (가장 대표적으로 쓰인다.) 암호화 상세 로직은 소수를 활용하여 생성하는 것인데 더 자세한 것은 나중에... 정리해보기로 하자.

아무튼 RS256이라고 하는 것은 RSA 암호화 알고리즘으로 JWT 서명 프로세스에 활용되며 HS256과 마찬가지로 무결성과 기밀성을 위해 쓰인다.


끝.



추가로 Auth0의 Docs의 서명 알고리즘에 따르면 RS256을 더 추천한다. 그 이유는

  • 개인키의 소유자만 토큰을 복호화 할 수 있어 토큰 유효성 검사 및 보안이 더 낫다.
  • 여러 대상이 공개키를 활용하여 유효한 토큰을 생성할 수 있다.
  • 개인키가 손상 될 경우 어플리케이션이나 API를 다시 배포할 필요 없이 키 순환을 구현할 수 있다는 것이다.
  • -> HS256은 미리 키값을 공유 해야하지만 RS256은 공유할 필요가 없다.

즉 보안, 유효성, 키 값의 손상 우려 없이 RS256이 더 낫다는 뜻이다.

진짜 끝.



반응형

댓글