JWT 발급부분 코드분석

2023. 4. 6. 14:26WEB

//토큰 생성 메서드
public String create(UserDetails userDetails) {
    Date expiryDate = Date.from(Instant.now().plus(30, ChronoUnit.DAYS)); //-토큰 종료 날짜

    return Jwts.builder()
            .signWith(SignatureAlgorithm.HS512, SECRET_KEY) // 시크릿 키는 토큰을 암호화하거나 복호화 할때 사용된다.
            // HS512는 암호화 알고리즘으로, 시크릿 키와 HS512를 통해 암,복호화 하는것이다.
            .setSubject(userDetails.getUsername()) // JWT의 서브젝트를 생성하는 부분 서브젝트 : 사용자의 식별자(사용자를 식별할수 있는 무언가),발급되는 대상을 지정하는것
            .setIssuer("room app") // 발급자 설정. 해당 JWT을 발급한 대상
            .setIssuedAt(new Date()) // 발급 시작 시점
            .setExpiration(expiryDate) // 발급 종료 시점
            .compact(); // JWT을 문자열로 반환
}


//토큰을 매개값으로 받아서 시크릿 키를 이용해 복호화 하는 메서드
public String validateAndGetUserId(String token) {
    Claims claims = Jwts.parser() // JWT 검증 파서 생성
            .setSigningKey(SECRET_KEY) // 시크릿키 설정
            .parseClaimsJws(token) // 검증된 JWT을 파싱 (불러옴)
            .getBody(); // 파싱된 JWT의 BODY를 불러옴
    return claims.getSubject(); // 해독한 token값을 보냄
}

//그렇다면 이 메소드는 사용자의 세션에 있는 토큰을 불러와서 사용자의 식별자를 리턴하고
//서버는 이 식별자를 통해서 SecurityContextHolder에 인증되어있는 사용자를 검증한다. 만약 있으면 사용자의 정보를 가지고
// 무언가를 수행한다.

//그렇다면 토큰만 있으면 인증에 성공하니까 토큰을 탈취해가면 다른사람도 내 정보를 가지고 인증할수있는 일이 벌어진다.
//이를 방지하기 위해서 토큰의 수명주기를 짧게한다.

'WEB' 카테고리의 다른 글

세션과 쿠키  (0) 2023.04.14
스프링 시큐리티 로그인 코드 분석  (0) 2023.04.06
클라이언트의 요청 방식  (0) 2023.04.02