본문 바로가기
BackEnd/Spring

[Jwt] Jason Web Token :: JWT 로 로그인 처리하기

by pplucy 2021. 12. 8.

* 개발환경 : 스프링부트 / Vue.js 

 

 

이전에 서블렛이나 스프링에서는 세션을 통한 로그인 처리를 진행했지만, 스프링 부트로 프로젝트를 시작하고 나서는 로그인을 처리할 때 요즘? 많이 사용하는 방법인 토큰 발급 기법을 사용하기로 했다.

 

해당 유저의 입력 정보가 DB정보와 일치하면,

백에서 해당 유저를 판별할 수 있는 정보가 담긴 Access_token과 재발급을 위한 Refresh_token을 발급해주고

프론트에서는 해당 토큰을 받아 store.js 에 저장 해줄 것이다.

 

로그인정보 입력부터 사용자에게 token 전달이 되는 전체 구현방식은

' 사용자 로그인 -> 정보 확인 후 일치 시 토큰 발급 - >  사용자에게 전달 -> 사용자가 API 통신 시 token 함께 전달 '

이렇게 된다.

 


*** Jwt 토큰 발급, 검증하기 ***

 

>  JJWT dependecy 추가

implementation 'io.jsonwebtoken:jjwt:0.9.1'

--- 해당 dependency를 추가하면 Jwt를 사용할 수 있다.

 

 

> JWT Token 관리를 위한 클래스 생성

 

 

> 토큰 발급

public static String makeAccessToken(Map<String, Object> adminObj) {

    return Jwts.builder()
                .setSubject("Auth_Token")
                .setExpiration(new Date(System.currentTimeMillis() + ACCESS_EXPIRE_MINUTE))
                .claim("claims", createClaims(adminObj))
                .signWith(SignatureAlgorithm.HS256 , SECRET_KEY.getBytes())
                .compact();
}
private static Object createClaims(Map<String, Object> adminObj){
        Map<String, Object> claimsMap = new HashMap<>();
        claimsMap.put("adminId" , adminObj.get("adminId"));
        return claimsMap;
    }

--- setSubject : 토큰의 용도

--- setExperation : 토큰 만료시간

--- claim : 저장 할 데이터

--- signWith : 서명 암호화

 

해당 토큰에 만료시간(setExperation), 저장 정보(claim), 암호화 된 서명(signWith)을 저장해서 발급한다.

발급 된 토큰은 응답 코드를 통해 넘어가게 되고 이를 Vue의 store를 통해 저장한다.

 

 

> 토큰 유효성 검증

 

토큰이 유효한 지 확인하려면 이 토큰의 만료시간을 체크해야 한다.

public static boolean validateToken(String authToken){
        try {
            Jwts.parser()
                    .setSigningKey(SECRET_KEY.getBytes())
                    .parseClaimsJws(authToken)
                    .getBody();
            return true;
        } catch(ExpiredJwtException e){  // 토큰 만료시 에러 출력
            e.printStackTrace();
        } catch(Exception e){  // 그 외의 에러 출력
            e.printStackTrace();
        }
        return false;
    }

 

토큰이 만료된 경우나 기타 에러가 있는 경우 Exception이 발생하게 되고,

해당 토큰이 존재하지 않는 경우엔 return false;

해당 토큰이 존재하고, 만료시간도 남아있는 경우엔 return true;

 

 

> 토큰 정보 확인

 

유저의 정보를 토큰에 저장하기 때문에 해당 유저의 데이터를 읽기 위해서는 토큰의 정보를 파악해야 한다.

public static Map<String, Object> getTokenInfo(String authToken){
        Map<String, Object> claimsMap = new HashMap<>();
        try{
            Claims claims = Jwts.parser()
                    .setSigningKey(SECRET_KEY.getBytes())
                    .parseClaimsJws(authToken)
                    .getBody();
            claimsMap = claims;
        } catch(JwtException e){
            e.printStackTrace();
        } catch(Exception e){
            e.printStackTrace();
        }
            return claimsMap;
        }

토큰의 정보는ㅍ Map으로 리턴되기 때문에 원하는 정보를 key값으로 꺼내올 수 있다.

 


프론트에서는 발급된 토큰 값을 받아 store에 저장하고, 유저정보가 필요한 API에 요청 시, header에 token을 담아서 전송한다.

API에서는 이 토큰을 받아 안에 담긴 정보를 확인 후 처리될 데이터를 리턴해준다.

 

프론트 로그인 처리 마무리 -> https://pplucy.tistory.com/89

'BackEnd > Spring' 카테고리의 다른 글

[Spring] Spring Web _ MyBatis 2) @Mapper- Repository  (0) 2021.04.05

댓글