안녕하세요 된짱지걔입니다.
이번에는 대칭키 vs 비대칭키에 대해 알아보겠습니다.
왜 인증 배우는데 이런게 나올까요?
혹시 기억하실랑가요?

네..ㅈㅅ합니다...
바로바로 jwt는 header+payload+signature 구성되어있죠?
이때 header에는 signature를 어떤 알고리즘으로 검증할지를 적는다고 했어요
여기서 알고리즘에 대칭키, 비대칭키 같은 값이 들어가는겁니다!

번외지만 제가 미국 교환학생 시절 cyber security를 수강했는데 이때 배운걸 오랜만에 보니 반갑더라구요 그 당시 모든단어를 영어로 이해하고 외우느라 힘들었는데 덕분에 까먹지 않게 된 것 같습니다..
symmetric key 라고도 하는데요 ㅎㅎ^^

E[x,k] -> D[k,y] 라고도 말할 수 있겠습니다.
즉 x라는 input text를 key로 암호화하고
다시 key로 복호화해서 output text를 도출해내는 것입니다!
asymmetric key 라고도 합니다~^^ㅎㅎ

E[puk,x] -> D[prk,y]
즉 공개키(public key)로 input text를 암호화하고
다시 비공개키(private key)로 복호화해서 output text를 도출해내는 것입니다!
근데 반대의 경우도 가능합니다!
즉 E[prk, x] -> D[puk, x] 와 같은 경우입니다!!
그렇담 둘의 차이는 무엇일까요?
이 경우는 기밀성을 위하여 사용합니다.
공개키 = 모두가 접근 가능
비공개키 = 특정 한 사람만 접근 가능
예를 들면 사용자들이 각각 자신의 데이터를 공개키를 사용해서 암호화하여 서버에게 보내면 서버만 사용자들의 각 데이터들을 복호화할 수 있는 것이죠!
이 경우는 인증을 위한 용도입니다.
앞서 말씀드린 것처럼 비공개키는 특정 한 사람만 접근이 가능하잖아요?
따라서 본인만 만들 수 있고 그것을 모두가 접근 가능 즉, 검증할 수 있다는 것이죠
이것이 바로 jwt 의 알고리즘 방법입니다.
여기서 단점은
1. 연산이 대칭키보다 훨씬 무거움!

살짝 이상하지 않습니까?
기억하실지 모르겠지만 저번 글에서 서명은 암호화(내용물을 암호화)가 아니라고 말씀드렸습니다.
그렇담 서명은 어떤 과정을 거칠까요?

1. message = m 이 있습니다..
2. m을 해시함수에 넣습니다.. H(m) = h
3. h 에 asymmetric key algorithm 을 이용 (private key)-> s (signature)
4. m+s
->
1. m+s
2. m을 해시함수에 넣습니다.. H(m) = h'
3. s에 asymmetric key algorithm 을 이용 (public key) -> h
4. 직접 계산한 h'와 복원한 h 를 비교하여 맞는지 확인
그치만 jwt에서 쓰이는건 잘 와닿지 않을 것 같아요..

즉...
인증 서버가 토큰에 서명을 해서 클라이언트에게 주면 다른 key를 가진 서버가 클라이언트를 만났을 때 복호화하여 원본해시와 대조함으로써 검증이 가능하게 되는 것입니다!!
이제 대칭키와 비대칭키의 장단점에 대해 말해보겠습니달라
장점= 연산이 빠르고 구현이 쉬워요
단점=
1. 같은 secret key를 공유하다보니 도청을 당하거나 탈취당할 위험이 있습니다
2. 브루트포스(brute force)공격을 당할 수 있습니다
-> secret key 값을 찾을 때까지 가능한 수를 무작위로 조합하여 공격하는 것을 의미!
3. 다른 팀에게 검증해주려면 시크릿 키 자체를 넘겨줘야하기 때문에 신뢰 범위 넓히기에 어려움이 있습니다
=> 서버가 하나거나, 발급&검증하는 곳이 같은 팀인 소규모에 적합
장점= 키분리가 가능 -> 신뢰 범위 상관x(public key 유출 상관x)
단점=
1. 연산이 대칭키보다 훨씬 무거워요
2. 키 페어 관리 복잡도가 높아요(생성, 로테이션, 만료 관리-> 키배포 인프라)
=> 검증 주체가 여러개거나 토큰을 공유해야하는 구조에 적합
실무에서 마이크로서비스 아키텍처(api통신) 가 흔해지면서 RS256을 기본값으로 쓰는 경우가 많긴합니다!!

그럼 다음에 또 뵙겠슴니다.
행쇼~!