jwt 토큰 을 추가하는 도중
이미 사용중인 서비스가 사용하고 있는걸 추상화하는 작업중에 제네릭을 사용한 후기이다.
서비스 마다 다른 토큰유지 시간, 페이로드를 갖고 있는데
오버라이딩을 사용하였는데 코드리뷰 때 같은 기능을 하면서 약간의 필드추가만 되는것이라서 제네릭을 사용해보는게 어떻냐는 피드백을 받았다. 물론 처음 써보는거라서 시간이 오래 걸렸다. 재미있었고 신세계였다 (제대로 쓴것도 아니지만)
아래와 같이 제네릭 클래스를 생성하고 issue (토큰발행) 을 실행했을 때 제네릭 타입으로 생성 하였다
@Data
@AllArgsConstructor
public class TokenPayload<T> {
private T tokenPayload;
public T getTokenPayload() {
return tokenPayload;
}
}
@Transactional
@Override
public JsonWebTokenDto issue(IssueReqeust request) {
User user = findByIdAndPwd(request.getId(),request.getPwd());
TokenPayloadDto payload = getTokenPayloadDto(user);
return jwtTokenService.generateTokens(new TokenPayload<>(payload));
}
전달받은 payload 를 claim 에 저장하려면 payload.getTokenPayload() 로 갖고 오면 된다.
그러면 Token 을 생성하면서 아래와 같이 이쁘게 나온다.
public <T> GeneratedTokenDto createAccessToken(@NotNull TokenPayload<T> payload) {
// ...
JwtBuilder jwtBuilder = Jwts.builder()
.setSubject(subject)
.claim(Constants.JWT_PRIVATE_CLAIMS_MEMBER_KEY, payload.getTokenPayload())
.setIssuedAt(issuedAt)
.setExpiration(expiration).setHeaderParam(Header.TYPE, Header.JWT_TYPE)
.signWith(SignatureAlgorithm.HS256, accessSecretKeyByte);
// ...
return GeneratedTokenDto.builder().tokenType(tokenType).subject(subject)
.issueAt(issuedAt).expiration(expiration).token(jwtBuilder.compact()).build();
}
{
"sub": "1",
"companyMember": {
"id": 1,
"branchId": 123,
"serviceId": 4567
},
"iat": 1678784812,
"exp": 1678785412,
"role": [
"ADMIN"
]
}
반응형
'WEB > JAVA' 카테고리의 다른 글
화면에 원하는 에러메시지 보내기 (1) | 2023.03.09 |
---|---|
나만 어려운 예외처리 (0) | 2022.05.19 |
Enum Type 에서 Function Interface 활용 (0) | 2022.04.01 |
Test-Driven-Development 테스트 주도 개발 (0) | 2022.03.24 |
Java 8 Interface - default 메서드, static 메서드 (0) | 2022.03.23 |