diff --git a/egovframe-template-simple-react-contribution/src/api/egovFetch.js b/egovframe-template-simple-react-contribution/src/api/egovFetch.js index 2bf0b80..d1f9ded 100644 --- a/egovframe-template-simple-react-contribution/src/api/egovFetch.js +++ b/egovframe-template-simple-react-contribution/src/api/egovFetch.js @@ -16,12 +16,11 @@ export function requestFetch(url, requestOptions, handler, errorHandler) { console.log("requestFetch [requestOption] : ", requestOptions); // Login 했을경우 JWT 설정 - const sessionUser = getLocalItem('loginUser'); - const sessionUserId = sessionUser?.userId || null; const jToken = getLocalItem('jToken'); - const userInfo = parseJwt(jToken); + const sessionUser = parseJwt(jToken); + const sessionUserId = sessionUser?.id || null; const refreshToken = getLocalItem('refreshToken'); - if(sessionUserId != null && sessionUserId !== undefined){ + if(sessionUserId != null){ if( !requestOptions['headers'] ) requestOptions['headers']={} if( !requestOptions['headers']['Authorization'] ) requestOptions['headers']['Authorization']=null; requestOptions['headers']['Authorization'] = jToken; diff --git a/egovframe-template-simple-react-contribution/src/components/EgovHeader.jsx b/egovframe-template-simple-react-contribution/src/components/EgovHeader.jsx index 5cf7673..71beb2e 100644 --- a/egovframe-template-simple-react-contribution/src/components/EgovHeader.jsx +++ b/egovframe-template-simple-react-contribution/src/components/EgovHeader.jsx @@ -38,6 +38,7 @@ function EgovHeader({ loginUser, onChangeLogin }) { } EgovNet.requestFetch(logOutUrl, requestOptions, function (resp) { + debugger console.log("===>>> logout resp= ", resp); if (parseInt(resp.resultCode) === parseInt(CODE.RCV_SUCCESS)) { onChangeLogin({ loginVO: {} }); @@ -75,7 +76,7 @@ function EgovHeader({ loginUser, onChangeLogin }) {
  • (isActive ? "cur" : "")}>정보마당
  • (isActive ? "cur" : "")}>고객지원
  • (isActive ? "cur" : "")}>알림마당
  • - {sessionUserSe ==='USR' && + {sessionUserSe ==='ADM' &&
  • (isActive ? "cur" : "")}>사이트관리
  • } @@ -141,7 +142,7 @@ function EgovHeader({ loginUser, onChangeLogin }) {
  • (isActive ? "cur" : "")}>사이트 갤러리
  • - {sessionUserSe ==='USR' && + {sessionUserSe ==='ADM' &&

    사이트관리

    - {sessionUserSe ==='USR' && + {sessionUserSe ==='ADM' && <>

    사이트관리

    diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/jwt/EgovJwtTokenUtil.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/jwt/EgovJwtTokenUtil.java index 2a4a074..a254d7e 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/jwt/EgovJwtTokenUtil.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/jwt/EgovJwtTokenUtil.java @@ -50,9 +50,6 @@ import java.util.UUID; public class EgovJwtTokenUtil implements Serializable{ private static final long serialVersionUID = -5180902194184255251L; - //public static final long JWT_TOKEN_VALIDITY = 24 * 60 * 60; //하루 - public static final long JWT_ACCESS_TOKEN_SEC = (30*60*1000); //엑세스 토큰의 유효시간 설정, 30분 - public static final long JWT_REFRESH_TOKEN_SEC = (60*60*24*14*1000); //리프레시 토큰의 유효시간 설정, 2주 public static final String SECRET_KEY = EgovProperties.getProperty("Globals.jwt.secret"); private final RefreshTokenRepository refreshTokenRepository; @@ -89,9 +86,10 @@ public class EgovJwtTokenUtil implements Serializable{ //2. Sign the JWT using the HS512 algorithm and secret key. //3. According to JWS Compact Serialization(https://tools.ietf.org/html/draft-ietf-jose-json-web-signature-41#section-3.1) // compaction of the JWT to a URL-safe string - public String generateToken(UserInfo loginVO, Long sec) { + public String generateToken(UserInfo loginVO, String remoteAddr, Long sec) { Map claims = new HashMap<>(); claims.put("id", loginVO.getUserId() ); + claims.put("remoteAddr", remoteAddr); claims.put("userSe", loginVO.getUserSe() ); claims.put("type", "Authorization"); @@ -106,13 +104,13 @@ public class EgovJwtTokenUtil implements Serializable{ return builder.compact(); } - public String generateAccessToken(UserInfo loginVO) { - return generateToken(loginVO, JWT_ACCESS_TOKEN_SEC); + public String generateAccessToken(UserInfo loginVO, String remoteAddr, Long sec) { + return generateToken(loginVO, remoteAddr, sec); } @Transactional - public String generateRefreshTokenToken(UserInfo loginVO){ - RefreshToken refreshToken = new RefreshToken(loginVO.getUserSeq(), generateToken(loginVO, JWT_REFRESH_TOKEN_SEC)); + public String generateRefreshTokenToken(UserInfo loginVO, String remoteAddr, Long sec){ + RefreshToken refreshToken = new RefreshToken(loginVO.getUserSeq(), generateToken(loginVO, remoteAddr, sec), remoteAddr); refreshTokenRepository.save(refreshToken); return refreshToken.getRefreshToken(); } diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/jwt/redis/RefreshToken.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/jwt/redis/RefreshToken.java index 91fdab0..2916664 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/jwt/redis/RefreshToken.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/jwt/redis/RefreshToken.java @@ -17,4 +17,6 @@ public class RefreshToken { private Integer userSeq; @Indexed private String refreshToken; + private String remoteAddr; + } diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/CustomLogoutSuccessHandler.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/CustomLogoutSuccessHandler.java index 3f0c605..ccab17e 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/CustomLogoutSuccessHandler.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/CustomLogoutSuccessHandler.java @@ -16,6 +16,7 @@ import org.springframework.security.web.savedrequest.RequestCache; import org.springframework.security.web.savedrequest.SavedRequest; import javax.servlet.ServletException; +import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @@ -26,7 +27,10 @@ public class CustomLogoutSuccessHandler implements LogoutSuccessHandler { @Override public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { - + Cookie refreshToken = new Cookie("refreshToken", null); + refreshToken.setMaxAge(0); + refreshToken.setPath("/"); + response.addCookie(refreshToken); MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter(); MediaType jsonMimeType = MediaType.APPLICATION_JSON; diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/CustomUrlAuthenticationSuccessHandler.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/CustomUrlAuthenticationSuccessHandler.java index eb460ef..941ebcb 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/CustomUrlAuthenticationSuccessHandler.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/config/security/CustomUrlAuthenticationSuccessHandler.java @@ -17,6 +17,7 @@ import org.springframework.security.web.savedrequest.RequestCache; import org.springframework.security.web.savedrequest.SavedRequest; import javax.servlet.ServletException; +import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @@ -28,6 +29,8 @@ public class CustomUrlAuthenticationSuccessHandler extends SimpleUrlAuthenticati private final EgovJwtTokenUtil jwtTokenUtil; private RequestCache requestCache = new HttpSessionRequestCache(); + public static final long JWT_ACCESS_VALID_TIME = (30*60*1000); //엑세스 토큰의 유효시간 설정, 30분 + public static final long JWT_REFRESH_VALID_TIME = (60*60*24*14*1000); //리프레시 토큰의 유효시간 설정, 2주 @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, @@ -52,13 +55,16 @@ public class CustomUrlAuthenticationSuccessHandler extends SimpleUrlAuthenticati MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter(); MediaType jsonMimeType = MediaType.APPLICATION_JSON; - String refreshToken = jwtTokenUtil.generateRefreshTokenToken(securityUser); - String jwtToken = jwtTokenUtil.generateAccessToken(securityUser); - HashMap resultMap = new HashMap(); + String jwtToken = jwtTokenUtil.generateAccessToken(securityUser, request.getRemoteAddr(), JWT_ACCESS_VALID_TIME); + String refreshToken = jwtTokenUtil.generateRefreshTokenToken(securityUser, request.getRemoteAddr(), JWT_REFRESH_VALID_TIME); + HashMap resultMap = new HashMap<>(); resultMap.put("resultCode", "200"); - resultMap.put("refreshToken", refreshToken); resultMap.put("jToken", jwtToken); + resultMap.put("refreshToken", refreshToken); response.addHeader("Authorization", "BEARER "+jwtToken); + Cookie refreshTokenCookie = new Cookie("refreshToken", refreshToken); + refreshTokenCookie.setMaxAge((int)JWT_REFRESH_VALID_TIME/1000); + response.addCookie(refreshTokenCookie); if (jsonConverter.canWrite(resultMap.getClass(), jsonMimeType)) { jsonConverter.write(resultMap, jsonMimeType, new ServletServerHttpResponse(response)); } diff --git a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/standardCode/service/StandardCodeContentInterface.java b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/standardCode/service/StandardCodeContentInterface.java index 41c2abe..c8d15d0 100644 --- a/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/standardCode/service/StandardCodeContentInterface.java +++ b/kcsc-back-end/src/main/java/com/dbnt/kcscbackend/standardCode/service/StandardCodeContentInterface.java @@ -1,6 +1,7 @@ package com.dbnt.kcscbackend.standardCode.service; public interface StandardCodeContentInterface { + String getDoc_cont_seq(); String getOnto_link_cd(); String getGroup_title(); String getCont_type_cd(); diff --git a/kcsc-back-end/src/main/resources/application.properties b/kcsc-back-end/src/main/resources/application.properties index a072886..b84eaef 100644 --- a/kcsc-back-end/src/main/resources/application.properties +++ b/kcsc-back-end/src/main/resources/application.properties @@ -4,7 +4,7 @@ spring.mvc.pathmatch.matching-strategy=ant_path_matcher # Page Config Globals.pageUnit=10 -Globals.pageSize=10 +Globals.pageSize=10o #JWT # redisConfig