회원 아이디 정보를 토큰에 숨겨놓았다고 하여 디코딩을 해보았다.
header, payload, signature 세 가지로 분리가 가능하며, 필요한 정보는 payload에 숨겨져 있다.
/**
* [응답 예시]
* header: {"alg":"HS256"}
* payload: {"sub":"65","iat":1722328823,"exp":1724920823}
* signature: �p�]��4��U�(��X�|��i�D�vH
*/
fun getTokenPayload(token: String): String {
val tokenParts = token.split(".")
val decoder = Base64.getUrlDecoder()
val header = String(decoder.decode(tokenParts[0]))
val payload = String(decoder.decode(tokenParts[1]))
val signature = String(decoder.decode(tokenParts[2]))
LogUtil.d_dev("[JwtDecodingUtil] header: $header")
LogUtil.d_dev("[JwtDecodingUtil] payload: $payload")
LogUtil.d_dev("[JwtDecodingUtil] signature: $signature")
return payload
}
payload에 숨겨진 멤버 정보를 data class로 파싱하여 뽑아쓴다.
나는 멤버 아이디를 정수로 변환하는 코드를 짰다.
object GetMemberIdExtension {
fun String.getMemberId(): Int? {
return try {
val memberId = Gson().fromJson(this, MemberId::class.java)
memberId.sub.toInt()
} catch (e: JsonSyntaxException) {
LogUtil.e_dev("JsonSyntaxException: ${e.localizedMessage}")
null
} catch (e: NumberFormatException) {
LogUtil.e_dev("NumberFormatException: ${e.localizedMessage}")
null
}
}
data class MemberId(
val sub: String,
val iat: Long,
val exp: Long
)
}