본문 바로가기
Back-end/멋쟁이사자처럼

[멋쟁이사자처럼] level5 구현

by 잔디🌿 2024. 3. 19.

    2주차 과제는 토큰을 생성하고, 받은 토큰을 디코딩하여 원하는 정보를 얻는 것이었습니다.

     

    level5

     

    <클레임에 원하는 값을 넣어 토큰 생성하기>

    public String createToken(Long memberId) {
        // TODO [5단계] 현재 시간과 설정된 만료 시간을 사용하여 만료 날짜를 설정하세요.
        key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
    
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);
    
        Date exp = new Date(nowMillis + 3600000);
        // TODO [5단계] memberId를 클레임으로 추가하세요.
        Claims claims = Jwts.claims();
        claims.put("userId", Long.toString(memberId));
        // TODO [5단계] 설정된 알고리즘으로 토큰을 서명하고 반환하세요.
    
        String jwt = Jwts.builder()
                .setSubject("likelion_김민지")
                .setIssuedAt(now)
                .setExpiration(exp)
                .signWith(key,SignatureAlgorithm.HS256)
                .setClaims(claims)
                .compact();
    
        return jwt;
    }

     

    우선, 원하는 알고리즘을 사용하기 위해 key를 생성했습니다. 위에는 나오지 않았지만 key는 나중에 디코딩을 원활하게 하기 위해서 전역변수로 선언하였다.

     

    현재 시간은 currentTimeMillis를 사용하여 가져왔고, 이를 Date에 넣어서 now를 만들었다.

    그리고 만료시간은 위에서 구한 now에 유효한 기간을 더해서 구했다.

    그 다음 원하는 정보를 clame에 저장하기 위해 clame 객체를 만들고, userId를 key값으로, memberId는 value값으로 설정하였다.

     

    그 다음 토큰을 builder을 통해서 위와 같이 만들었다 .

     

    <토큰에서 클레임 가져오기>

    public Long extractMemberId(String token) {
        // TODO [5단계] 알고리즘을 사용해 토큰의 유효성을 검증하고, "memberId" 클레임에서 회원 ID를 추출하세요. 유효하지 않은 경우 "유효하지 않은 토큰입니다." 메시지와 함께 UnAuthorizedException을 발생시키세요.
        try{
            Claims claims = Jwts.parserBuilder()
                    .setSigningKey(key)
                    .build()
                    .parseClaimsJws(token)
                    .getBody();
    
            return  Long.parseLong(claims.get("userId").toString());
        }
        catch(Exception e){
            throw new UnAuthorizedException("유효하지 않은 토큰입니다.");
        }
    }

    유효하지 않은 토큰을 거르기 위해서 try-catch문을 사용하였다. 

    clame을 추출하는 과정을 찾기가 굉장히 어려웠는데, key를 사용해야 한다는 것을 몰라서 헤맸던 것 같다.

    결론적으로는 위와 같이 구현해서 해결했다!

     

    클리어!