본문 바로가기

공부/Spring

스프링 부트 3 백엔드 개발자 되기_18

@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() 검증 테스트부터 하기