해시는 키와 값의 형태를 가지고 있는 알고리즘의 한 종류다.
키가 존재하기때문에 검색과 저장을 빠르게 할 수 있다는 장점이 있다.
해시 함수
는 입력받은 특정 값을 정해놓은 hash 알고리즘에 의해 변환해주는 것을 이야기하고
그 과정 자체를 해싱
이라고 부르게 된다.
대충 이런 느낌을 가지고 있다고 보면 된다.
1이란 것이 들어오면 QEW가 값이라서 1:QEW로 저장이 되고
2라는 것이 들어오면 ABC가 값이라서 1:ABC로 저장이 되고
12라고 들어오면 두개가 합쳐져서 12:QEWABC로 저장이 된다.
하지만 저장되어있는 QEWABC을 이용하여 12를 다시 돌려받는 것은 불가능
하고, QEWABC=12라는 것은 확인할 수 있다.
이런 것을 단방향성 해시라고 부른다.
그래서 이것을 암호화에서 사용을 하고 있는데,
내가 배웠던 과정에서는 Bcrypt라는 것이 있다.
요것은 위키피디아 링크 => https://ko.wikipedia.org/wiki/Bcrypt
요것은 온라인에서 bcrypt를 써볼 수 있는 링크 => https://www.devglan.com/online-tools/bcrypt-hash-generator
단순하게만 생각하면 저렇게 나갈 수 있지만, 한번의 해시 작업으로는 해석하기 쉽기 때문에
해시된 것을 또 다시 해시를 해버리는 것이 비크립트의 방식이다.
해시한 것을 또 다시 하는 작업은 키 스트레칭(key stretching)이라고 부른다.
그리고 그것이 아쉬워서 조금 더 작업을 하는 것을 솔팅(salting)이라고 부른다. (진짜 소금치네)
그러던 와중 이해가 안되는 부분이 있었다.
바로 솔팅하는 정보를 따로 설정해주는게 없음에도 작업이 되는 것이 이상했다.
어느정도 세팅을 따로 정해주고 한다면 이해가 되지만, 그것이 없는 상태로 솔팅을 했음에도 불구하고
이것이 매치가 된다는 것을 체크한다는 것이 불분명하기 때문이였는데,
알고리즘 로직상 비크립트의 솔팅은 가지고 있던 문자열 일부를 사용하여 작업을 한다는 것이였다(....)
단방향이 있다면, 양방향도 있을 것이다. 그것은 바로 많이 사용되는 JWT에서 사용이 된다.
세션의 방식도 많이 쓴다고 JWT도 인터넷 표준이라 상당히 많이 쓴다고 한다.
JWT의 특징은 이것이다.
유저의 정보를 사용해서 해시를 해서 토큰 값으로 생성을 하고, 그것을 다시 복호화
하여 사용한다는 점.
왜냐하면 토큰에 유저에 대한 정보가 담겨있지 않는다면 이게 이 유저가 맞는지 인증 작업이 없어서 인가가 불가능하기 때문이다. 그렇기 때문에 JWT는 양방향성 해시의 특성을 가지고 있다.
A를 가지고 123058123 를 만들었다면
123058123를 가지고 A임을 확인하는 것 뿐만 아니라, 다시 되돌려서 A라는 것으로 뽑아낼 수 있다.
이때문에 JWT에서는 토큰을 생성하는 정보에 최소한의 정보를 담는 것을 추천을 하고 있다고 한다.
더불어서 생성하는 정보에 또다시 해시 암호화를 걸어서 사용하는 방법도 있다고 하는데...
이건 나중에 알아봐야할 것 같다. 점점 깊숙하게 들어가니까 머리속에 혼란이 가중치로 쌓이는 것 같다ㅠㅠ