간혹 마주할 수 있는 함정 하나.cs
어쩌다 보니
기존 닷넷기반 프로그램을 자바 스프링 기반 서버로 다시 구현하게 됐습니다.
(모바일용 서버 구축하기 위함)
로그인이 문젠데
단방향 암호화 값이 계속 닷넷쪽과 자바쪽이 다르게 나오는 겁니다.
결국 원인은 찾아 냈는데
이 닷넷에서 쓰는 Encoding.Unicode 라는 녀석이, 단순한 녀석이 아니었던 겁니다.
UTF-16 이라는
많이 써왔다 라는 카더라만 있지 다들 거의 본 적도 없어보이는 캐릭터셋이 있습니다.
얘가 이래뵈도 UTF-8보다 먼저 나왔고, 닷넷에서 “유니코드”라고 하면 얘를 가리킵니다.
근데, 얘는 이게 한 종류가 아니랍니다.
UTF-16 LE (little endian) / UTF-16 BE (big endian)
이렇게 두 종류로 나뉘어집니다. 왜 갑자기 인디언 타령이 나오는지는 TMI이니 각자 구글 참고…
닷넷에서 UTF-16 (Unicode 기본) 을 쓰면, UTF-16 LE 로 동작하고
자바에서 UTF-16 그냥 이렇게만 명시해서 바이너리 추출하면 UTF-16 BE 로 추출이 됩니다.
문자열을 바이너리로 뽑아보면 결과가 다릅니다.
값이 전체가 다르다기보다는, 글자 하나하나마다 자리 바꾸기한 느낌으로 다릅니다.
… 뭐 지금 흔히 보편화된 UTF-8이, UTF-16보다 더 나중에 나왔다는 건 들어서 알고있긴 한데
그래도 한번쯤은 정리 싹 해서
UTF-16을 지구상에서 싹 없애버리는 게 좋지 않았을까 싶기도 하고…
여하튼 이걸로 4시간 정도 날려먹었는데, 어쨌든 알아내긴 했네요.