기술 공부
JWT 생성 및 반환 구현
랼랼
2022. 4. 10. 20:22
1) build.gradle 의존성
https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt/0.9.1
메이븐 레파지토리에 직접 들어가보니 취약성이 58개나 발견되지만(!)
우선 실습을 위해 사용한다.
build.gradle의 <dependencies>에 다음과 같은 속성을 준다.
// https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt
implementation group: 'io.jsonwebtoken', name: 'jjwt', version: '0.9.1'
TokenProvider 서비스를 다음과 같이 만든다.
@Slf4j
@Service
public class TokenProvider {
private static final String SECRET_KEY ="안알랴쥼";
//토큰 생성
public String create(UserEntity userEntity) {
//기한은 지금부터 1일로 설정
Date expireDate = Date.from(
Instant.now().plus(1,ChronoUnit.DAYS)
);
//JMT Token 생성
return Jwts.builder()
//header에 들어갈 알고리즘, 시크릿키
.signWith(SignatureAlgorithm.HS512, SECRET_KEY)
//payload의 내용
.setSubject(userEntity.getId()) //sub
.setIssuer("demo app") //iss
.setIssuedAt(new Date()) //iat
.setExpiration(expireDate) //exp
.compact();
}
//토큰 확인
public String validDateAndGetUserId(String token) {
Claims claims = Jwts.parser()
.setSigningKey(SECRET_KEY) //시크릿 키 세팅
//Base64로 디코딩 및 파싱 후
//시크릿 키로 헤더와 페이로드로 새 서명 생성 후 기존 서명과 비교
//위조 시 예외 처리를 날림
.parseClaimsJws(token)
//비위조 시 몸통
.getBody();
//가져온 내용 중 subject, 즉 id를 리턴한다.
return claims.getSubject();
}
}
JWT 의 구조와 생성 원리, 동작 원리를 안다면 간단(?)하다.
1) create : 토큰을 생성하여 리턴한다.
Header의 알고리즘을 선택하고, 이를 서명으로 변경할 시크릿키를 입력한다.
Payload에 필요한 정보를 입력하고, 이를 compact()를 이용하여 header.payload.signature 로 바꾼 뒤
Base64로 인코딩하여 리턴한다.
2) vaildDateAndGetUserId : 토큰을 통해 인증을 확인하고 id를 리턴한다.
시크릿키를 설정하고, pareseClaimsJws 메서드를 통해 토큰을 디코딩한다.
디코딩 후, Header와 Payload 부분으로 Signature를 새로 생성하고, 기존의 Signature와 비교한다.
서로 다르다면 예외처리를 날리고, 같다면 sub인 id를 리턴한다.
반응형