중간저장

cks
강석 최 2023-12-20 18:04:24 +09:00
parent e174d6deea
commit f3202261ec
8 changed files with 32 additions and 21 deletions

View File

@ -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;

View File

@ -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 }) {
<li><NavLink to={URL.INTRO} className={({ isActive }) => (isActive ? "cur" : "")}>정보마당</NavLink></li>
<li><NavLink to={URL.SUPPORT} className={({ isActive }) => (isActive ? "cur" : "")}>고객지원</NavLink></li>
<li><NavLink to={URL.INFORM} className={({ isActive }) => (isActive ? "cur" : "")}>알림마당</NavLink></li>
{sessionUserSe ==='USR' &&
{sessionUserSe ==='ADM' &&
<li><NavLink to={URL.ADMIN} className={({ isActive }) => (isActive ? "cur" : "")}>사이트관리</NavLink></li>
}
</ul>
@ -141,7 +142,7 @@ function EgovHeader({ loginUser, onChangeLogin }) {
<li><NavLink to={URL.INFORM_GALLERY} className={({ isActive }) => (isActive ? "cur" : "")}>사이트 갤러리</NavLink></li>
</ul>
</div>
{sessionUserSe ==='USR' &&
{sessionUserSe ==='ADM' &&
<div className="col">
<h3>사이트관리</h3>
<ul>
@ -207,7 +208,7 @@ function EgovHeader({ loginUser, onChangeLogin }) {
<li><NavLink to={URL.INFORM_GALLERY} className={({ isActive }) => (isActive ? "cur" : "")}>사이트 갤러리</NavLink></li>
</ul>
</div>
{sessionUserSe ==='USR' &&
{sessionUserSe ==='ADM' &&
<>
<h3><Link to={URL.ADMIN}>사이트관리</Link></h3>
<div className="submenu closed">

View File

@ -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<String, Object> 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();
}

View File

@ -17,4 +17,6 @@ public class RefreshToken {
private Integer userSeq;
@Indexed
private String refreshToken;
private String remoteAddr;
}

View File

@ -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;

View File

@ -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<String, Object> resultMap = new HashMap<String, Object>();
String jwtToken = jwtTokenUtil.generateAccessToken(securityUser, request.getRemoteAddr(), JWT_ACCESS_VALID_TIME);
String refreshToken = jwtTokenUtil.generateRefreshTokenToken(securityUser, request.getRemoteAddr(), JWT_REFRESH_VALID_TIME);
HashMap<String, Object> 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));
}

View File

@ -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();

View File

@ -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