JWT decoding

aram·2024년 8월 2일
0

Json web token을 디코딩하기

회원 아이디 정보를 토큰에 숨겨놓았다고 하여 디코딩을 해보았다.
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
    }

json 파싱하기

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
    )
}

0개의 댓글