1. Token 발급
- 사용자가 로그인 시 access token과 refresh token을 발급함
@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody UserDto userDto) {
Map<String, Object> resultMap = new HashMap<>();
HttpStatus status = null;
try {
UserDto loginUser = userService.loginUser(userDto);
if (loginUser != null) {
String accessToken = jwtService.createAccessToken("userid", loginUser.getId());// key, data
String refreshToken = jwtService.createRefreshToken("userid", loginUser.getId());// key, data
userService.saveRefreshToken(userDto.getId(), refreshToken);
// logger.debug("로그인 accessToken 정보 : {}", accessToken);
// logger.debug("로그인 refreshToken 정보 : {}", refreshToken);
resultMap.put("access-token", accessToken);
resultMap.put("refresh-token", refreshToken);
resultMap.put("message", SUCCESS);
status = HttpStatus.ACCEPTED;
} else {
resultMap.put("message", FAIL);
status = HttpStatus.ACCEPTED;
}
} catch (Exception e) {
logger.error("로그인 실패 : {}", e);
resultMap.put("message", e.getMessage());
status = HttpStatus.INTERNAL_SERVER_ERROR;
}
return new ResponseEntity<Map<String, Object>>(resultMap, status);
}
2. access-token 인증
@ApiOperation(value = "회원인증", notes = "회원 정보를 담은 Token을 반환한다.", response = Map.class)
@GetMapping("/info/{userid}")
public ResponseEntity<Map<String, Object>> getInfo(
@PathVariable("userid") @ApiParam(value = "인증할 회원의 아이디.", required = true) String userid,
HttpServletRequest request) {
logger.debug("userid : {} ", userid);
Map<String, Object> resultMap = new HashMap<>();
HttpStatus status = HttpStatus.UNAUTHORIZED;
if (jwtService.checkToken(request.getHeader("access-token"))) {
// logger.info("사용 가능한 토큰!!!");
try {
// 로그인 사용자 정보.
UserDto userDto = userService.userInfo(userid);
resultMap.put("userInfo", userDto);
resultMap.put("message", SUCCESS);
status = HttpStatus.ACCEPTED;
} catch (Exception e) {
logger.error("정보조회 실패 : {}", e);
resultMap.put("message", e.getMessage());
status = HttpStatus.INTERNAL_SERVER_ERROR;
}
} else {
logger.error("사용 불가능 토큰!!!");
resultMap.put("message", FAIL);
status = HttpStatus.UNAUTHORIZED;
}
return new ResponseEntity<Map<String, Object>>(resultMap, status);
}
3. Token 제거
- 회원 로그아웃 시 회원 정보를 담고 있는 token을 제거
// 로그아웃
@ApiOperation(value = "로그아웃", notes = "회원 정보를 담은 Token을 제거한다.", response = Map.class)
@GetMapping("/logout/{userid}")
public ResponseEntity<?> removeToken(@PathVariable("userid") String userid) {
Map<String, Object> resultMap = new HashMap<>();
HttpStatus status = HttpStatus.ACCEPTED;
try {
userService.deleRefreshToken(userid);
resultMap.put("message", SUCCESS);
status = HttpStatus.ACCEPTED;
} catch (Exception e) {
logger.error("로그아웃 실패 : {}", e);
resultMap.put("message", e.getMessage());
status = HttpStatus.INTERNAL_SERVER_ERROR;
}
return new ResponseEntity<Map<String, Object>>(resultMap, status);
}
4. Token 재발급
- access token의 유효기간이 만료되면 저장된 refresh token을 불러와 access을 재발급
@ApiOperation(value = "Access Token 재발급", notes = "만료된 access token을 재발급받는다.", response = Map.class)
@PostMapping("/refresh")
public ResponseEntity<?> refreshToken(@RequestBody UserDto userDto, HttpServletRequest request) throws Exception {
Map<String, Object> resultMap = new HashMap<>();
HttpStatus status = HttpStatus.ACCEPTED;
String token = request.getHeader("refresh-token");
logger.debug("token : {}, memberDto : {}", token, userDto);
if (jwtService.checkToken(token)) {
if (token.equals(userService.getRefreshToken(userDto.getId()))) {
String accessToken = jwtService.createAccessToken("userid", userDto.getId());
logger.debug("token : {}", accessToken);
logger.debug("정상적으로 액세스토큰 재발급!!!");
resultMap.put("access-token", accessToken);
resultMap.put("message", SUCCESS);
status = HttpStatus.ACCEPTED;
}
} else {
logger.debug("리프레쉬토큰도 사용불!!!!!!!");
status = HttpStatus.UNAUTHORIZED;
}
return new ResponseEntity<Map<String, Object>>(resultMap, status);
}
Controller 파일 전체 소스