포스트

2021-08-20-TIL

2021-08-20-TIL

Kotlin

MD5 해시코드 생성

  • https://stackoverflow.com/questions/64171624/what-is-the-best-way-to-generate-an-md5-hash-in-kotlin

Kotlin에는 해시 함수가 따로 없어서 JDK의 MessageDigest를 그대로 쓴다. MessageDigest.getInstance("MD5")로 인스턴스를 얻고 digest()로 바이트 배열을 받는다. MD5는 모든 Java 플랫폼 구현이 지원해야 하는 표준 알고리즘이다(MessageDigest Javadoc).

1
2
3
4
5
6
import java.security.MessageDigest

fun md5(input: String): String =
    MessageDigest.getInstance("MD5")
        .digest(input.toByteArray())
        .joinToString("") { "%02x".format(it) }

digest()는 16바이트 배열을 돌려주므로 사람이 읽거나 다른 서버와 비교하려면 16진수 문자열로 바꾼다. 바이트마다 %02x로 두 자리를 맞추지 않으면 0x0a가 a로 찍혀 길이가 달라진다. 외부 서버와 해시를 맞출 때는 문자열을 바이트로 바꾸는 인코딩(보통 UTF-8)도 양쪽이 같아야 한다.

MD5는 충돌 저항성이 깨진 알고리즘이다. RFC 6151은 디지털 서명처럼 충돌 저항성이 필요한 곳에는 더 이상 쓸 수 없다고 정리한다. 외부 API가 요구하는 체크섬이나 캐시 키처럼 보안과 무관한 곳에만 쓰고, 비밀번호 저장이나 서명에는 쓰지 않는다.


외부 서버와의 통신

Gson을 이용한 Json 직렬화 (toString)

  • https://github.com/google/gson
  • https://www.bezkoder.com/kotlin-parse-json-gson/

Gson은 자바 객체를 JSON으로, JSON을 자바 객체로 바꾸는 라이브러리이고 toJson()과 fromJson() 두 메서드가 중심이다. Spring Boot는 기본으로 Jackson을 쓰므로, Gson은 외부 API 요청 본문을 만드는 정도로 범위를 한정하는 편이 설정이 섞이지 않는다.

1
2
val body: String = Gson().toJson(request)
val response: ApiResponse = Gson().fromJson(json, ApiResponse::class.java)

RestTemplate Post Request

  • https://www.baeldung.com/spring-resttemplate-post-json
  • https://recordsoflife.tistory.com/328

RestTemplate으로 POST를 보낼 때는 응답 본문만 필요하면 postForObject, 상태 코드와 헤더까지 필요하면 ResponseEntity를 돌려주는 postForEntity를 쓴다(RestTemplate Javadoc). 요청 객체로 POJO를 넘기면 메시지 컨버터가 JSON으로 바꾸고, 헤더를 직접 정하려면 HttpEntity로 감싼다.

1
2
3
val headers = HttpHeaders().apply { contentType = MediaType.APPLICATION_JSON }
val entity = HttpEntity(request, headers)
val response = restTemplate.postForEntity(url, entity, ApiResponse::class.java)

Javadoc은 Spring 5.0부터 RestTemplate이 유지보수 모드이고, 동기·비동기·스트리밍을 모두 지원하는 WebClient를 고려하라고 안내한다.


HTTP POST using JSON in Java

  • https://stackoverflow.com/questions/7181534/http-post-using-json-in-java
참고한 자료외부 출처 4

외부 출처

이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.

댓글

아직 댓글이 없습니다