유저의 비밀번호는 절대 비밀번호 그대로 DB에 저장하지 않는다.
그러므로 유저의 비밀번호를 암호화해서 저장해서 DB가 해킹을 당해도 그대로 노출되지 않고 내부 인력도 비밀번호를 알 수 없다.
본래 해쉬(hash)함수는 자료구조에서 빠른 자료의 검색, 데이터의 위변조 체크를 위해서 쓰이지만, 복원이 불가능한 단방향 해쉬함수는 암호학적 용도로 사용된다.
'1234'를 SHA-256으로 해싱하면 03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4 라는 값을 얻을 수 있다.
결과만 보면 식별이 불가능하지만, 같은 알고리즘으로 '1234'를 다시 해싱하면 항상 같은 결과가 도출된다.
이런 허점을 이용해서 가능한 경우의 수를 모두 해시값으로 만들어서 판매하는 서비스도 존재한다. (Rainbow Table)
이런 Rainbow Table을 이용해서 해시값을 유추해주는 사이트도 존재한다.
이같은 허점을 보호하고자 salting과 Key Stretching 이라는 아이디어가 생겨났다. 비밀번호와 임의로 생성한 문자열(Salt)를 합쳐서 해싱하여 이 해싱값을 저장하는 방법이다.
JWT
라고 한다.위의 그림은 JWT의 구조이다.
헤더에는 어떤 정보가 들어갈까?
다음으로 내용(payload) 은 무엇이 들어갈까?
내용에는 exp와 같이 만료시간을 나타내는 공개 클레임과 클라이언트와 서버간 협의하에 사용하는 비공개 클레임. 이 두가지 요소를 조합하여 작성한 뒤, BASE64 인코딩하여 두번째 요소로 위치한다.