본문 바로가기
로그인 기능 및 인증/1. JWT

JWT3. 하드코딩으로 JWT 생성 및 사용(1)

by 혀닙 2022. 3. 3.

목차

  1. 진수변환(인코딩)
  2. 해쉬값 생성
  3. 실습(헤더,페이로드 선언>인코딩>해쉬값부여>JWT생성)


# 1. 진수 변환(인코딩)

1 -1 . 진수 변환

(1) 버퍼의 두번째 매개변수로 진수 넣기

-버퍼 : 컴퓨터가 데이터 저장 시 바이트(16진수) 형태로 저장하는 공간

Buffer.from(변환할 대상, `진수`)

-매개변수 1 : 변환할 대상

  • 변수인 경우 그대로 작성
  • 스트링인 경우 일반 스트링 작성법과 동일하게 작성
  • 객체인 경우 아래의 메서드를 매개변수 1자리에 넣어서 스트링으로 변환
JSON.stringify(스트링으로 변환할 객체)


-매개변수 2 : 진수

  • 기본적으로 디폴트 값이 UTF-8
  • 64진수 변환 : `base64`

(2)toString 메서드의 매개변수로 진수 넣기

Buffer.from(변환할 대상).toString(`진수`)

-매개변수 : 진수

  • 디폴트 값이 UTF-8
  • 16진수 변경 : `hex`
  • 64진수 변경 : `base64`

1 -2 . URL-SAFE 문자로 변환하기 위해 =(equal sign) 제거

replace(/[=]/g,'')

-매개변수 1 : 대체 전 문자 / 정규식
-매개변수 2 : 대체 후 문자

#2 해쉬값 생성

1. sha256의 알고리즘으로 해쉬 생성

crypto.createHash(`sha256`)


2. Hmac의 알고리즘으로 해쉬 생성

crypto.createHmac(`sha256`,Buffer.from(`secret key`))


3. 서명 생성 시 사용할 대상, 즉 인코딩된 헤더와 페이로드

update(서명 생성시 사용할 대상)


4. 진수 변환

.digest(`진수`)

-매개변수 : 진수

  • 16진수 변경 : `hex`
  • 64진수 변경 : `base64`



#3 JWT 생성해보자!

1. 헤더와 페이로드 선언

const header = {
    typ : "JWT",
    alg : "HS256"
}


const payload = {
	//공개되어도 상관없는 민감하지 않은 정보, 쿠키에 담을 정도의 수준
    userid : `coke`,
    name : `coca-cola`
}


2. 인코딩

// 객체를 스트링으로 변환 
// 버퍼를 통해 16진수로 변환
// 내용이 길기 때문에 64진수로 변환하여 내용 줄임
// 16진수에서 64진수 변환 시 남는 공간 = 로 나타남
// 빈 비트값을 나타낸 =(url safe 하지 않음)을 replace메서드로 제거(정규표현식 사용)


const encodingHeader = Buffer.from(JSON.stringify(header))
.toString(`base64`)
.replace(/[=]/g,'')


const encodingPayload = Buffer.from(JSON.stringify(payload))
.toString(`base64`)
.replace(/[=]/g,'')


3. 해쉬값 생성

const crypto = require(`crypto`)	//node 내장 라이브러리

// signature생성을 위해서는 header와 payload에 대한 해쉬값 만들어야 함
// 버퍼 사용하여 64진수로 변경

const secretKey = `salt`

const signature = crypto.createHmac(`sha256`,Buffer.from(secretKey))
.update(`${encodingHeader},${encodingPayload}`)
.digest(`base64`)   //64진수로 변환(통신할 때, 아마도 텍스트 길이를 줄이기 위해서??)
.replace(/[=]/g,'') //= 제거


4. JWT 생성
.을 기준으로 인코딩된 헤더, 인코딩된 페이로드 , 서명으로 나누어져 있음

const jwt = `${encodingHeader}.${encodingPayload}.${signature}`

'로그인 기능 및 인증 > 1. JWT' 카테고리의 다른 글

JWT3. 하드코딩으로 JWT 생성 및 사용(2)  (0) 2022.03.03
JWT2. 기본 개념  (0) 2022.03.03
JWT1. 암호화의 개념  (0) 2022.03.02

댓글