Compare commits

..

No commits in common. "79f1b3860ec2779da04a4f6f475a93995f8dda9f" and "462cae1cf1feeb0c2585d9b6906d43edb255ecb3" have entirely different histories.

8 changed files with 21 additions and 32 deletions

View File

@ -16,11 +16,12 @@ export function requestFetch(url, requestOptions, handler, errorHandler) {
console.log("requestFetch [requestOption] : ", requestOptions); console.log("requestFetch [requestOption] : ", requestOptions);
// Login 했을경우 JWT 설정 // Login 했을경우 JWT 설정
const sessionUser = getLocalItem('loginUser');
const sessionUserId = sessionUser?.userId || null;
const jToken = getLocalItem('jToken'); const jToken = getLocalItem('jToken');
const sessionUser = parseJwt(jToken); const userInfo = parseJwt(jToken);
const sessionUserId = sessionUser?.id || null;
const refreshToken = getLocalItem('refreshToken'); const refreshToken = getLocalItem('refreshToken');
if(sessionUserId != null){ if(sessionUserId != null && sessionUserId !== undefined){
if( !requestOptions['headers'] ) requestOptions['headers']={} if( !requestOptions['headers'] ) requestOptions['headers']={}
if( !requestOptions['headers']['Authorization'] ) requestOptions['headers']['Authorization']=null; if( !requestOptions['headers']['Authorization'] ) requestOptions['headers']['Authorization']=null;
requestOptions['headers']['Authorization'] = jToken; requestOptions['headers']['Authorization'] = jToken;

View File

@ -38,7 +38,6 @@ function EgovHeader({ loginUser, onChangeLogin }) {
} }
EgovNet.requestFetch(logOutUrl, requestOptions, EgovNet.requestFetch(logOutUrl, requestOptions,
function (resp) { function (resp) {
debugger
console.log("===>>> logout resp= ", resp); console.log("===>>> logout resp= ", resp);
if (parseInt(resp.resultCode) === parseInt(CODE.RCV_SUCCESS)) { if (parseInt(resp.resultCode) === parseInt(CODE.RCV_SUCCESS)) {
onChangeLogin({ loginVO: {} }); onChangeLogin({ loginVO: {} });
@ -76,7 +75,7 @@ function EgovHeader({ loginUser, onChangeLogin }) {
<li><NavLink to={URL.INTRO} className={({ isActive }) => (isActive ? "cur" : "")}>정보마당</NavLink></li> <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.SUPPORT} className={({ isActive }) => (isActive ? "cur" : "")}>고객지원</NavLink></li>
<li><NavLink to={URL.INFORM} className={({ isActive }) => (isActive ? "cur" : "")}>알림마당</NavLink></li> <li><NavLink to={URL.INFORM} className={({ isActive }) => (isActive ? "cur" : "")}>알림마당</NavLink></li>
{sessionUserSe ==='ADM' && {sessionUserSe ==='USR' &&
<li><NavLink to={URL.ADMIN} className={({ isActive }) => (isActive ? "cur" : "")}>사이트관리</NavLink></li> <li><NavLink to={URL.ADMIN} className={({ isActive }) => (isActive ? "cur" : "")}>사이트관리</NavLink></li>
} }
</ul> </ul>
@ -142,7 +141,7 @@ function EgovHeader({ loginUser, onChangeLogin }) {
<li><NavLink to={URL.INFORM_GALLERY} className={({ isActive }) => (isActive ? "cur" : "")}>사이트 갤러리</NavLink></li> <li><NavLink to={URL.INFORM_GALLERY} className={({ isActive }) => (isActive ? "cur" : "")}>사이트 갤러리</NavLink></li>
</ul> </ul>
</div> </div>
{sessionUserSe ==='ADM' && {sessionUserSe ==='USR' &&
<div className="col"> <div className="col">
<h3>사이트관리</h3> <h3>사이트관리</h3>
<ul> <ul>
@ -208,7 +207,7 @@ function EgovHeader({ loginUser, onChangeLogin }) {
<li><NavLink to={URL.INFORM_GALLERY} className={({ isActive }) => (isActive ? "cur" : "")}>사이트 갤러리</NavLink></li> <li><NavLink to={URL.INFORM_GALLERY} className={({ isActive }) => (isActive ? "cur" : "")}>사이트 갤러리</NavLink></li>
</ul> </ul>
</div> </div>
{sessionUserSe ==='ADM' && {sessionUserSe ==='USR' &&
<> <>
<h3><Link to={URL.ADMIN}>사이트관리</Link></h3> <h3><Link to={URL.ADMIN}>사이트관리</Link></h3>
<div className="submenu closed"> <div className="submenu closed">

View File

@ -50,6 +50,9 @@ import java.util.UUID;
public class EgovJwtTokenUtil implements Serializable{ public class EgovJwtTokenUtil implements Serializable{
private static final long serialVersionUID = -5180902194184255251L; 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"); public static final String SECRET_KEY = EgovProperties.getProperty("Globals.jwt.secret");
private final RefreshTokenRepository refreshTokenRepository; private final RefreshTokenRepository refreshTokenRepository;
@ -86,10 +89,9 @@ public class EgovJwtTokenUtil implements Serializable{
//2. Sign the JWT using the HS512 algorithm and secret key. //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) //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 // compaction of the JWT to a URL-safe string
public String generateToken(UserInfo loginVO, String remoteAddr, Long sec) { public String generateToken(UserInfo loginVO, Long sec) {
Map<String, Object> claims = new HashMap<>(); Map<String, Object> claims = new HashMap<>();
claims.put("id", loginVO.getUserId() ); claims.put("id", loginVO.getUserId() );
claims.put("remoteAddr", remoteAddr);
claims.put("userSe", loginVO.getUserSe() ); claims.put("userSe", loginVO.getUserSe() );
claims.put("type", "Authorization"); claims.put("type", "Authorization");
@ -104,13 +106,13 @@ public class EgovJwtTokenUtil implements Serializable{
return builder.compact(); return builder.compact();
} }
public String generateAccessToken(UserInfo loginVO, String remoteAddr, Long sec) { public String generateAccessToken(UserInfo loginVO) {
return generateToken(loginVO, remoteAddr, sec); return generateToken(loginVO, JWT_ACCESS_TOKEN_SEC);
} }
@Transactional @Transactional
public String generateRefreshTokenToken(UserInfo loginVO, String remoteAddr, Long sec){ public String generateRefreshTokenToken(UserInfo loginVO){
RefreshToken refreshToken = new RefreshToken(loginVO.getUserSeq(), generateToken(loginVO, remoteAddr, sec), remoteAddr); RefreshToken refreshToken = new RefreshToken(loginVO.getUserSeq(), generateToken(loginVO, JWT_REFRESH_TOKEN_SEC));
refreshTokenRepository.save(refreshToken); refreshTokenRepository.save(refreshToken);
return refreshToken.getRefreshToken(); return refreshToken.getRefreshToken();
} }

View File

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

View File

@ -16,7 +16,6 @@ import org.springframework.security.web.savedrequest.RequestCache;
import org.springframework.security.web.savedrequest.SavedRequest; import org.springframework.security.web.savedrequest.SavedRequest;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
@ -27,10 +26,7 @@ public class CustomLogoutSuccessHandler implements LogoutSuccessHandler {
@Override @Override
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { 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(); MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
MediaType jsonMimeType = MediaType.APPLICATION_JSON; MediaType jsonMimeType = MediaType.APPLICATION_JSON;

View File

@ -17,7 +17,6 @@ import org.springframework.security.web.savedrequest.RequestCache;
import org.springframework.security.web.savedrequest.SavedRequest; import org.springframework.security.web.savedrequest.SavedRequest;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
@ -29,8 +28,6 @@ public class CustomUrlAuthenticationSuccessHandler extends SimpleUrlAuthenticati
private final EgovJwtTokenUtil jwtTokenUtil; private final EgovJwtTokenUtil jwtTokenUtil;
private RequestCache requestCache = new HttpSessionRequestCache(); 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 @Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
@ -55,16 +52,13 @@ public class CustomUrlAuthenticationSuccessHandler extends SimpleUrlAuthenticati
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter(); MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
MediaType jsonMimeType = MediaType.APPLICATION_JSON; MediaType jsonMimeType = MediaType.APPLICATION_JSON;
String jwtToken = jwtTokenUtil.generateAccessToken(securityUser, request.getRemoteAddr(), JWT_ACCESS_VALID_TIME); String refreshToken = jwtTokenUtil.generateRefreshTokenToken(securityUser);
String refreshToken = jwtTokenUtil.generateRefreshTokenToken(securityUser, request.getRemoteAddr(), JWT_REFRESH_VALID_TIME); String jwtToken = jwtTokenUtil.generateAccessToken(securityUser);
HashMap<String, Object> resultMap = new HashMap<>(); HashMap<String, Object> resultMap = new HashMap<String, Object>();
resultMap.put("resultCode", "200"); resultMap.put("resultCode", "200");
resultMap.put("jToken", jwtToken);
resultMap.put("refreshToken", refreshToken); resultMap.put("refreshToken", refreshToken);
resultMap.put("jToken", jwtToken);
response.addHeader("Authorization", "BEARER "+jwtToken); 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)) { if (jsonConverter.canWrite(resultMap.getClass(), jsonMimeType)) {
jsonConverter.write(resultMap, jsonMimeType, new ServletServerHttpResponse(response)); jsonConverter.write(resultMap, jsonMimeType, new ServletServerHttpResponse(response));
} }

View File

@ -1,7 +1,6 @@
package com.dbnt.kcscbackend.standardCode.service; package com.dbnt.kcscbackend.standardCode.service;
public interface StandardCodeContentInterface { public interface StandardCodeContentInterface {
String getDoc_cont_seq();
String getOnto_link_cd(); String getOnto_link_cd();
String getGroup_title(); String getGroup_title();
String getCont_type_cd(); String getCont_type_cd();

View File

@ -4,7 +4,7 @@ spring.mvc.pathmatch.matching-strategy=ant_path_matcher
# Page Config # Page Config
Globals.pageUnit=10 Globals.pageUnit=10
Globals.pageSize=10o Globals.pageSize=10
#JWT #JWT
# redisConfig # redisConfig