jwt 토큰 decode 하기

jwt 토큰 decode 함수

2023-08-31

JSON 웹 토큰(JWT)

일반적으로 헤더.페이로드.서명 으로 구성되어 있다.

1.헤더 - 어떤 알고리즘으로 암호화 할것인지

2.데이터 - 전달하려는 정보, 사용자의 id, name 등

3. 서명 - 서버가 지정한 secret key로 암호화 시켜 토큰을 변조하기 어렵게 만듬

이 세 부분을 Base64url로 인코딩해 

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI

위와 같은 형태로 파싱해 사용한다.

jwt 데이터 부분에서 정보를 가져와 사용할 수 있는데, decoding 해주어야 한다.

export const decodeJwtResponse = (token: string) => {
  let base64Url = token.split('.')[1]
  let base64 = base64Url?.replace(/-/g, '+')?.replace(/_/g, '/')
  let jsonPayload = decodeURIComponent(
    atob(base64)
      .split('')
      .map(function (c) {
        return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)
      })
      .join('')
  )

  return JSON.parse(jsonPayload)
  let base64Payload = token.split('.')[1]

  let payload = Buffer.from(base64Payload, 'base64')
  return JSON.parse(payload.toString())
}

atob 함수는 node에서 더이상 지원하지 않아 아래로 수정

export const decodeJwtResponse = (token: string) => {
  let base64Payload = token.split('.')[1]

  let payload = Buffer.from(base64Payload, 'base64')

  return JSON.parse(payload.toString())
}

token을 split해 1번째 데이터에 해당하는 부분을 가져온 다음

node에서 지원하는 Buffer 객체를 사용해 바이너리로 변환

base64로 인코딩한 후 JSON으로 파싱한다