JWT Signature 알고리즘
JWT Signature 개념
JWT 시그니쳐는 서명에 대한 정보로, 헤더와 페이로드를 인코딩한 값을 합치고, 특정 알고리즘과 특정 키로 암호화되어 있는 값이다. 암호화되어 있기 때문에 복호화를 하지 않으면 볼 수 없다.
헤더와 페이로드는 암호화된 값이 아니라, 인코딩되어 있다. 헤더와 페이로드는 보안이 취약하기 때문에 시그니처를 추가하여 위변조를 판별할 수 있다.(너가 만든게 맞냐고 체크)
JWT 암호화 방식
1. 대칭키 암호화
암호화, 복호화 키가 같을 경우 대칭키 암호화 방식이라고 한다.
- 같은 키를 사용하여 암호화, 복호화하기 때문에 속도가 빠르다.
- 대표적으로 HMAC 암호화 알고리즘이 있다.
- 값에 SHA256를 적용해서 해싱 후 private key(대칭키 역할)로 암호화한다.
- private key를 알고 있는 서버만 JWT를 복호화할 수 있다.
- auth 서버가 없으면 대칭키가 편할 수 있음.
2. 비대칭키 암호화
암호화, 복호화 키가 다른 경우 비대칭키 암호화 방식이라고 한다.
- 속도가 느리지만, 대칭키 암호화에 비해 안전하다.
- 대표적으로 RSA 암호화 알고리즘이 있다.
- 값에 SHA256을 적용해서 해싱 후 비밀키로 암호화한다.
- 공개키는 공개적으로 제공한다. 어떤 서버든 공개키를 통해 JWT를 복호화할 수 있다.
SHA256 알고리즘
HS256, RS256 알고리즘에서 공통적으로 사용되는 SHA256 알고리즘에 대해 알아보자.
- SHA(Secure Hash Algorithm)의 한 종류로 256비트로 구성되며 64자리 문자열을 반환
- 블록체인에서 가장 많이 사용
- 2^256 만큼 경우의 수를 만들 수 있음
- 많은 시간이 소요될 정도로 큰 숫자이기 때문에 충돌로부터 비교적 안전하다고 평가됨
- 해쉬 알고리즘은 복호화가 불가능하다. 즉, 해쉬 알고리즘 종류 중 하나인 SHA256 알고리즘은 복호화가 불가능하다.
HS256 알고리즘 [대칭키 암호화]
- JWT 암호화 알고리즘으로 많이 사용한다.
- HS256 알고리즘 = HMAC + SHA256
- 메시지(ex.JWT의 페이로드)와 비밀키를 함께 사용하여 HMAC 생성
- SHA-256 해시 함수를 사용하여 메시지와 비밀키의 조합으로부터 고유한 해시 값을 생성
- 공유된 비밀키가 안전하게 관리될 수 있는 환경에서 효과적
- 비밀키가 노출될 경우, 보안에 위협받을 수 있기 때문에 비밀키 관리가 중요하다.
HS256 동작 방식
- JWT 생성: 헤더는 알고리즘과 토큰 타입을 명시하고, 페이로드는 클레임(예: 사용자 식별 정보)을 포함
- 비밀키 설정: 서버는 비밀키를 생성하고 안전하게 보관해야 한다. 이 비밀키는 JWT의 서명 생성과 검증에 사용된다.
- 시그니처 생성: HS256 알고리즘을 사용하여 JWT의 헤더와 페이로드를 결합한 문자열에 시그니처를 생성
- JWT 전송 및 검증: 생성된 JWT는 클라이언트에게 전송한다. 클라이언트는 요청 시 JWT를 포함하여 서버에 전송한다. 서버는 비밀키를 사용하여 시그니처를 검증하고, 검증이 성공하면 요청을 처리한다.
RS256 알고리즘 [비대칭키 암호화]
- RS256은 공개키와 비밀키를 사용한다.
- 서명 생성 - 개인키
- 서명 검증 - 공개키
- 수신자가 공개키로 시그니처를 검증했다는 것은, 개인키를 가진 발신자가 시그니처를 생성했고 메시지가 변경되지 않았음을 의미한다.
- RSA 암호화 방식으로, 복잡한 수학적 연산을 기반으로 하기 때문에 이를 통해 생성된 시그니처는 메시지의 무결성과 인증을 보장한다.
RS256 동작 방식
- 키 생성: 공개키와 비밀키 생성. 비밀키는 서버에 안전하게 보관되며, 공개키는 수신자에게 공유된다.
- JWT 생성: 헤더에는 사용된 알고리즘(RS256)이 명시되고, 페이로드에는 클레임이 포함된다.
- 시그니처 생성: 비밀키를 사용하여 JWT의 헤더와 페이로드에 서명한다. 이 시그니처는 JWT의 마지막 부분을 형성한다.
- JWT 전송 및 검증: 생성된 JWT는 클라이언트에게 전송된다. 클라이언트는 요청 시 JWT를 포함하여 서버에 전송한다. 수신자는 공개키를 사용하여 시그니처를 검증한다.