* 개발환경 : 스프링부트 / 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 |
---|
댓글