
참고 자료 : 우아한 기술 블로그
https://techblog.woowahan.com/9135/
Json web Token 은 통신을 수행하는 두 대상이 서로 보낸 데이터에 대하여 신뢰할 수 있게 데이터가 인코딩된 Token 을 의미
Stateless Token 으로 서버가 인증 작업을 수행하지 않는다
Stateless Token 으로 서버가 인증 작업을 수행하지 않는다 서버가 인증 토큰에 대한 제어권을 잃어, 관리할 방법이 없음.
=> 로직이 없어 여러명의 사용자가 api 요청을 했을 때, 서버를 거치지 않아 실행 시간이 빨라지고 서버에 부하가 없다

❓ XXS 란?
크로스 사이트 스크립팅 또는 교차 사이트 스크립팅(Cross Site Scripting, XSS)은 공격자가 상대방의 브라우저에 스크립트가 실행되도록 해 사용자의 세션을 가로채거나, 웹사이트를 변조하거나, 악의적 콘텐츠를 삽입하거나, 피싱 공격을 진행하는 것을 말합니다.
jwt 는 필요한 모든 정보를 자체적으로 지니고 있다는 장점이 있다. 이는 jwt 에서 발급된 토큰은 기본 정보, 전달할 정보, 검증에 대한 모든 signature 도 포함하고 있으며, 웹 서버 환경에서는 HTTP 헤더에 포함시키거나 URL 의 파라미터로도 전달이 가능하다.
(1) 최초 호출
클라이언트에서 서버로 최초 호출이 발생하는 경우 Header 내에 토큰의 존재 여부를 체크한다.
(2) 이후 호출
클라이언트에서 서버로 이후 호출이 발경하는 경우, 토큰의 만료 시간을 확인한다.
aaaaaa.bbbbbb.cccccc
header.payload.signature
{
"typ": "JWT", // 토큰의 타입
"alg": "HS256" // 토큰 서명에서 사용할 알고리즘의 종류
}
/**
* 헤더 값을 생성해주는 메서드
*
* @return HashMap<String, Object> 헤더 값
*/
private static Map<String, Object> createHeader() {
Map<String, Object> header = new HashMap<>();
header.put("typ", "JWT");
header.put("alg", "HS256");
header.put("regDate", System.currentTimeMillis());
return header;
}
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
/**
* 사용자 정보를 기반으로 클래임을 생성해주는 메서드
*
* @param userDto 사용자 정보
* @return Map<String, Object>
*/
private static Map<String, Object> createClaims(UserDto userDto) {
// 공개 클레임에 사용자의 이름과 이메일을 설정하여 정보를 조회할 수 있다.
Map<String, Object> claims = new HashMap<>();
log.info("userId :" + userDto.getUserId());
log.info("userNm :" + userDto.getUserNm());
claims.put("userId", userDto.getUserId());
claims.put("userNm", userDto.getUserNm());
return claims;
}
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
private static String jwtSecretKey = "jwtSecretKey";
/**
* JWT 서명(Signature) 발급을 해주는 메서드
*
* @return Key
*/
private static Key createSignature() {
byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(jwtSecretKey);
return new SecretKeySpec(apiKeySecretBytes, SignatureAlgorithm.HS256.getJcaName());
}