ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TIL 75일 - 로그인 시 jwt 반환
    공부/Spring 사용한 프로젝트 2022. 3. 14. 21:19

    일단 build.gradle에 추가.

    implementation 'io.jsonwebtoken:jjwt:0.9.1'

    application.properties에 시크릿 키 추가

    jwt.secret=yatyat2

    해싱할 때 저 키를 기준으로 동작할 것임

    jwt 토큰 생성해서 반환하기

    일단 아래 참고글에 있는 코드를 그대로 사용했다. 다만 토큰 생성과 상관없는 부분은 삭제를 했고, 내일 다시 토큰을 사용해서 인증 하는 것을 해보려고 한다. 하나씩하나씩.

    package com.example.ical;
    
    import com.example.ical.Domain.User;
    import io.jsonwebtoken.Claims;
    import io.jsonwebtoken.Jwts;
    import io.jsonwebtoken.SignatureAlgorithm;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    import java.io.Serializable;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.function.Function;
    
    @Component
    public class JwtTokenUtil implements Serializable {
        private static final long serialVersionUID = -2550185165626007488L;
    
        public static final long JWT_TOKEN_VALIDITY = 5 * 60 * 60;
    
        @Value("${jwt.secret}")
        private String secret;
    
        //generate token for user
        public String generateToken(User user) {
            Map<String, Object> claims = new HashMap<>();
            return doGenerateToken(claims, user.getEmail());
        }
    
        //while creating the token -
        //1. Define  claims of the token, like Issuer, Expiration, Subject, and the ID
        //2. Sign the JWT using the HS512 algorithm and secret key.
        //3. According to JWS Compact Serialization(https://tools.ietf.org/html/draft-ietf-jose-json-web-signature-41#section-3.1)
        //   compaction of the JWT to a URL-safe string
        private String doGenerateToken(Map<String, Object> claims, String subject) {
            return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis()))
                    .setExpiration(new Date(System.currentTimeMillis() + JWT_TOKEN_VALIDITY * 1000))
                    .signWith(SignatureAlgorithm.HS512, secret).compact();
        }
    }

    @Component

    빈 등록을 하려고 할 때 붙이는 어노테이션

    @Value("${jwt.secret}")

    application.properties에 추가한 아래 값을 가져다가 쓴다는 의미

    jwt.secret=yatyat2

    generateToken 메서드

    setClaims(claims)

    - jwt 페이로드에 지정된 이름, 값 쌍으로 채우는 것

    setSubject

    - 토큰 이름

    setIssuedAt

    - 발급 시간

    setExpiration

    - 만료 시간

    signWith

    - 알고리즘과 키를 사용해서 암호화 하는 것

    compact

    - serialize하는 거라고 함

    login api 수정하기

    토큰을 반환하도록 코드를 아래처럼 수정하고

    public String loginUser(String email, String password) {
            User user = userRepository.findUserByEmail(email).orElseThrow(() -> new ResponseStatusException(HttpStatus.BAD_REQUEST, "이메일이 존재하지 않습니다."));
            Boolean isMatched = passwordEncoder.matches(password, user.getPassword());
            System.out.println(jwtTokenUtil.generateToken(user));
            return jwtTokenUtil.generateToken(user);
        }

    API 요청을 날리면 아래처럼 토큰을 확인할 수 있다.

     

     

    참고글

    https://www.javainuse.com/spring/boot-jwt

     

    Spring Boot Security + JWT Hello World Example | JavaInUse

    package com.javainuse; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SpringBootHelloWorldApplication { public static void main(String[] args) { Sp

    www.javainuse.com


    어디보자... 내일 할일은... 

    일단 role을 jwt에 포함을 시켜야겠지? 그렇게 해서 반환하도록 하고...

    그 다음에 필터 적용해서 인증 검사하는거까지...?는 되려나 안 될 거 같기도

    '공부 > Spring 사용한 프로젝트' 카테고리의 다른 글

    TIL 78일 - mvc test  (0) 2022.03.17
    TIL 76일 - JWT 토큰 검증  (0) 2022.03.15
    TIL 74일 - Filters  (0) 2022.03.13
    TIL 73일 - 디스패쳐 서블릿  (0) 2022.03.12
    TIL 71일 - 스프링 자잘자잘  (0) 2022.03.10
Designed by Tistory.