목차
- 진수변환(인코딩)
- 해쉬값 생성
- 실습(헤더,페이로드 선언>인코딩>해쉬값부여>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 |
댓글