@RequiredArgsConstructor
@Service
public class TokenProvider {
private final JwtProperties jwtProperties;
public String generateToken(me.shinsunyoung.springbootdeveloper.domain.User user, Duration expiredAt){
Date now = new Date();
return makeToken(new Date(now.getTime() + expiredAt.toMillis()), user);
}
//JWT 토큰 생성 메서드, 인자는 만료시간과 유저 정보를 받는다 이메서드는set계열 메서드를 통해 여러 값을 지정
private String makeToken(Date expiry, me.shinsunyoung.springbootdeveloper.domain.User user){
Date now = new Date();
return Jwts.builder()
.setHeaderParam(Header.TYPE, Header.JWT_TYPE) //헤더 typ : JWT
//내용 iss : ajufresh@gmail.com(propertise 파일에서 설정한 값)
.setIssuer(jwtProperties.getIssuer())
.setIssuedAt(now) //내용 iat: 현재 시간
.setExpiration(expiry) //내용 exp : expiry 맴버 변수값
.setSubject(user.getEmail()) //내용 sub : 유저의 이메일
.claim("id", user.getId()) //클레임 id : 유저 id
//서명 : 비밀값과 함께 해시값을 HS256방식으로 암호화
.signWith(SignatureAlgorithm.ES256, jwtProperties.getSecretKey())
.compact();
}
//JWT 토큰 유효성 검증 메서드, 프로퍼티 파일에 선언한 비밀값과 토큰 복호화를 진행
public boolean validToken(String token){
try{
Jwts.parser()
.setSigningKey(jwtProperties.getSecretKey()) //비밀값으로 복호화
.parseClaimsJws(token);
return true;
} catch (Exception e){//복호화하는 과정에서 에러가 나면 유효하지 않은 토큰
return false;
}
}
//토큰 기반으로 인증 정보를 가져오는 메서드
public UsernamePasswordAuthenticationToken getAuthentication(String token){
Claims claims = getClaims(token);
Set<SimpleGrantedAuthority> authorities = Collections.singleton(new SimpleGrantedAuthority("ROLE_USER"));
return new UsernamePasswordAuthenticationToken(new org.springframework.
security.core.userdetails.User(claims.getSubject
(), "", authorities), token, authorities);
}
//토큰 기반으로 유저 id를 가져오는 메서드, 프로퍼티 파일에 저장한 비밀값으로 토큰을 복호화한 다음 클레임을
//가져오는 private 메서드인 getClaims()를 호출해서 클레임 정보를 반환받고 클레임에서 id키로 저장된 값을 가져와
//반환
public Long getUserId(String token){
Claims claims = getClaims(token);
return claims.get("id", Long.class);
}
private Claims getClaims(String token) {
return Jwts.parser() //클레임 조회
.setSigningKey(jwtProperties.getSecretKey())
.parseClaimsJws(token)
.getBody();
}
}
***
토큰생성 메서드에 들어가는 인자인 user는 프로젝트에서 만든 User클래스,
UsernamePasswordAuthenticationToken에 첫 인자로 들어가는 user는 프로젝트에서 만든 User 클래스가 아닌 스프링
시큐리티에서 제공하는 객체인 USer클래스를 임포트해야함
이후 JWT 토큰 서비스를 테스트할 모킹용 객체를 만든다
모킹이란 테스트를 실행할 때 객체를 대신하는 가짜 객체를 말함
======>
239pg의 validToken() 검증 테스트부터 하기
'공부 > Spring' 카테고리의 다른 글
스프링 부트 3 백엔드 개발자 되기_20 (0) | 2023.09.01 |
---|---|
스프링 부트 3 백엔드 개발자 되기_19 (0) | 2023.08.31 |
스프링 부트 3 백엔드 개발자 되기_17 (0) | 2023.08.29 |
스프링 부트 3 백엔드 개발자 되기_16 (0) | 2023.08.28 |
스프링 부트 3 백엔드 개발자 되기_15 (0) | 2023.08.25 |