5 - jwt 암호화와 secret key 생성 방법
Updated:
Categories: ci-cd-zero-downtime-auth
양방향 암호화, 생성 방법
jwt 토큰 암호화를 진행하면서 양방향의 대칭키와 비대칭키 두 가지 방식이 있는데 어떤 걸 사용해야 적합한지 의문점이 생겨 이를 조사해보려고 한다. 그리고 선택한 양방향 키를 어떻게 생성했는지 사용한 방법을 기록하려고 한다.
SHA, HS, RS?
JWT 토큰에 사용되는 키의 알고리즘 명을 보면 HS256나 RS256이라고 표기된 것을 몇 번 봤었다. S는 같은데 앞에 단어가 다르다 보니 헷갈리고 아리송했다.
해시 알고리즘 SHA256
SHA-256, 3, 512 등은 미국의 국립표준기술…… blah blah 표준 해시 알고리즘인 SHA 계열 중 하나인데 블록체인 쪽에서 많이 사용되고 있다고 한다. 그리고 여기서 말하는 해시 알고리즘은 원본 데이터를 고정된 길이의 다른 데이터로 변환하는 방식을 말한다. 이는, 단방향 암호화 방식을 생각하면 되는데, 그러니까 해싱 처리가 되면 원본 데이터로 돌아갈 수 없게 된다. 그러면 어떻게 비교를 하느냐라고 의문이 들 수 있는데 예로 입력한 비밀번호를 똑같이 해싱하여 처리된 해싱값과 같은지 비교하는 것이다. 왜냐하면 단 하나의 오차가 발생하면 두 값은 달라지기 때문이다.
HS256
앞에 H는 HMAC 알고리즘을 뜻한다. 이 알고리즘은 대칭키 암호화 알고리즘이다. 종류로는 HS256, HS384, HS512…. 등이 있고, 뒤에 기입된 숫자는 바이트 크기를 의미한다.
RS256
앞에 R은 RSA를 의미한다. RSA 알고리즘은 비대칭키 암호화 알고리즘이다.
단방향, 양방향
JWT의 암호화 방식은 양방향과 단방향이 두 가지로 분류한다. 이름에서 유추할 수 있듯이 단방향은 암호화만 가능한 방식이고, 양방향은 암호화/복호화가 모두 가능한 방식을 말한다.
대칭키 암호화
암호화, 복호화를 진행할 때 동일한 키를 사용한다면 이를 대칭키라고 한다.
JWT에서는 값을 단방향 암호화 방식인 SHA-256를 적용해서 해싱 후에 개인키로 암호화 시킨다.
같은 키를 사용하기 때문에 비대칭키와 비교해서 속도가 빠르다. 그리고 개인 키를 알고있는 서버만 유효성 검증이 가능하다. 이 말은 즉슨, 개인 서버에서는 적합하지만, 서버를 확장해야 하는 방식에서는 일일이 개인 키를 서버마다 갖고 있어야 하기 때문에 부적합하다.
비대칭키 암호화
복호화 키가 다르면 이를 비대칭키 방식이라고 한다.
마찬가지로, SHA-256를 먼저 사용해 해싱 후에 비밀키나 공개키로 암호화를 시킨다. 참고로 비밀키로 암호화를 했다면 공개키로 풀 수 있고(전자서명), 공개키로 암호화를 했다면 비밀키로 복호화가 가능하다(데이터 암호화). 보통 일반적인 상황에서는 비밀키로 암호화를 하고 공개키를 공개적으로 제공해서 공개키를 통해 복호화를 진행한다.
암호화, 복호화를 수행할 때 공개키와 개인키 두 개를 같이 사용하기 때문에 대칭키와 비교해서 느리지만, 보안이 더 높다. 비대칭키 암호화는 서버 구축 시 각 서버에 일일이 key를 갖고있을 필요가 없다. 왜냐하면 공개키를 모두에게 공개하기 때문이다. 때문에, 확장 방식의 서버에서 적합하다고 할 수 있다.
JWT HS 256이나 512 키 생성 방법
JWT 암호화를 하기 위해 HS 256을 사용하기로 결정하였다. 이유는 단독 개인서버이기 때문에 공유할 공개키가 필요없기 때문이다. 아무튼 크기가 256bit인 무작위 조합 수를 그냥 만들기는 뭐해서 찾아보게 되었다.
-Bash-
HS256 256bit -> 32byte
openssl rand -hex 32
HS512 512bit -> 64byte
openssl rand -hex 64
---------------------------------
openssl rand 명령은 무작위 데이터를 생성하는 데 사용
-hex 옵션은 출력이 16진수 형식으로 지정
숫자 64 , 32는 출력 문자열의 길이를 바이트 단위로 지정
댓글남기기