package com.takensoft.cms.mber.web; import com.takensoft.cms.mber.service.RefreshTokenService; import com.takensoft.common.util.ResponseData; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.nio.charset.Charset; /** * @author : takensoft * @since : 2024.04.01 * * RefreshToken 정보 관련 컨트롤러 */ @RestController @RequiredArgsConstructor @Slf4j public class RefreshTokenController { private final RefreshTokenService refreshTokenService; /** * @author takensoft * @since 2024.04.04 * @return * @throws Exception * 로그아웃 */ @PostMapping(value = "/mbr/logout.json") public ResponseEntity logout(HttpServletRequest req, HttpServletResponse res) throws Exception { int result = refreshTokenService.deleteByRefresh(req, res); // 응답 처리 HttpHeaders headers = new HttpHeaders(); headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8"))); ResponseData responseData = new ResponseData(); if(result > 0) { Cookie cookie = new Cookie("refresh", null); cookie.setMaxAge(0); // 생명주기 //cookie.setSecure(true); // https 통신을 할 경우 true로 사용 cookie.setPath("/"); // 쿠키 적용 범위 cookie.setHttpOnly(true); res.addCookie(cookie); responseData.setStatus(HttpStatus.OK); responseData.setMessage("정상적으로 로그아웃 처리되었습니다."); return new ResponseEntity<>(responseData, headers, HttpStatus.OK); } else { responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR); responseData.setMessage("로그아웃에 실패하였습니다.\n담당자에게 문의하세요."); return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR); } } /** * @author takensoft * @since 2024.04.04 * @return * @throws Exception * 토큰 재발급 */ @PostMapping("/refresh/tokenReissue.json") public ResponseEntity tokenReissue(HttpServletRequest req, HttpServletResponse res) throws Exception { int result = refreshTokenService.tokenReissueProc(req, res); // 응답 처리 HttpHeaders headers = new HttpHeaders(); headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8"))); ResponseData responseData = new ResponseData(); if(result > 0) { responseData.setStatus(HttpStatus.OK); responseData.setMessage("정상적으로 발급 처리되었습니다."); return new ResponseEntity<>(responseData, headers, HttpStatus.OK); } else { responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR); responseData.setMessage("로그인을 다시해주시기 바랍니다."); return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR); } } }