refreshToken 생성방법 변경.

cks
강석 최 2023-12-19 15:43:36 +09:00
parent 1a35c995d9
commit 1dbfdad1b7
8 changed files with 37 additions and 18 deletions

View File

@ -4,6 +4,7 @@ import URL from 'constants/url';
import CODE from 'constants/code';
import { getSessionItem, setSessionItem } from 'utils/storage';
import { getLocalItem, setLocalItem } from 'utils/storage';
import {parseJwt} from "../utils/parseJwt";
export function getQueryString(params){
return `?${Object.entries(params).map(e => e.join('=')).join('&') }`
@ -18,6 +19,7 @@ export function requestFetch(url, requestOptions, handler, errorHandler) {
const sessionUser = getLocalItem('loginUser');
const sessionUserId = sessionUser?.userId || null;
const jToken = getLocalItem('jToken');
const userInfo = parseJwt(jToken);
const refreshToken = getLocalItem('refreshToken');
if(sessionUserId != null && sessionUserId !== undefined){
if( !requestOptions['headers'] ) requestOptions['headers']={}

View File

@ -7,14 +7,16 @@ import URL from 'constants/url';
import CODE from 'constants/code';
import { getSessionItem, setSessionItem } from 'utils/storage';
import { getLocalItem, setLocalItem } from 'utils/storage';
import {parseJwt} from "../utils/parseJwt";
function EgovHeader({ loginUser, onChangeLogin }) {
console.group("EgovHeader");
console.log("[Start] EgovHeader ------------------------------");
const sessionUser = getLocalItem('loginUser');
const sessionUserId = sessionUser?.userId;
const sessionUserSe = sessionUser?.userSe;
const jToken = getLocalItem('jToken');
const userInfo = parseJwt(jToken);
const sessionUserId = userInfo?.id;
const sessionUserSe = userInfo?.userSe;
const navigate = useNavigate();

View File

@ -1,6 +1,7 @@
import React, { useState, useEffect, useRef } from 'react';
import {Link, useLocation, useNavigate} from 'react-router-dom';
import * as EgovNet from 'api/egovFetch';
import {parseJwt} from "../../utils/parseJwt";
import URL from 'constants/url';
import CODE from 'constants/code';
@ -20,7 +21,6 @@ function EgovLoginContent(props) {
const [userInfo, setUserInfo] = useState({ username: '', password: 'default', userSe: 'USR' });
// eslint-disable-next-line no-unused-vars
const [loginVO, setLoginVO] = useState({});
const [saveIDFlag, setSaveIDFlag] = useState(false);
@ -74,8 +74,8 @@ function EgovLoginContent(props) {
EgovNet.requestFetch(loginUrl,
requestOptions,
(resp) => {
let resultVO = resp.resultVO;
let jToken = resp?.jToken || null;
let resultVO = parseJwt(jToken);
let refreshToken = resp?.refreshToken || null;
// setSessionItem('jToken', jToken);
@ -83,11 +83,11 @@ function EgovLoginContent(props) {
setLocalItem('refreshToken', refreshToken);
debugger
if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) {
setLoginVO(resultVO);
// setSessionItem('loginUser', resultVO);
setLocalItem('loginUser', resultVO);
props.onChangeLogin(resultVO);
if (saveIDFlag) setLocalItem(KEY_ID, resultVO?.id);
if (saveIDFlag) {
setLocalItem(KEY_ID, resultVO?.id);
}
navigate(URL.MAIN);
// PC Mobile
document.querySelector('.all_menu.WEB').classList.add('closed');

View File

@ -12,6 +12,7 @@ import Modal from 'react-bootstrap/Modal';
import * as EgovNet from 'api/egovFetch';
import {getLocalItem} from "../../utils/storage";
import CODE from "../../constants/code";
import {parseJwt} from "../../utils/parseJwt";
function CodeViewer(props) {
const [treeLoading, setTreeLoading] = useState(true);
@ -29,7 +30,7 @@ function CodeViewer(props) {
const [bookMarkModal, setBookMarkModal] = useState();
const sessionUser = getLocalItem('loginUser');
const sessionUser = parseJwt(getLocalItem('jToken'));
const sessionUserSe = sessionUser?.userSe;
const handleClose = () => setShow(false);

View File

@ -0,0 +1,14 @@
const parseJwt = (token) => {
if(!token){
return null;
}
var base64Url = token.split('.')[1];
var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
var jsonPayload = decodeURIComponent(atob(base64).split('').map(function(c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
return JSON.parse(jsonPayload);
};
export {parseJwt};

View File

@ -51,7 +51,8 @@ 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_VALIDITY = (30); //토큰의 유효시간 설정, 기본 60분 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;
@ -88,11 +89,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 generateAccessToken(UserInfo loginVO) {
public String generateToken(UserInfo loginVO, Long sec) {
Map<String, Object> claims = new HashMap<>();
claims.put("id", loginVO.getUserId() );
claims.put("userSe", loginVO.getUserSe() );
claims.put("uniqId", loginVO.getUserSeq() );
claims.put("type", "Authorization");
log.debug("===>>> secret = "+SECRET_KEY);
@ -101,14 +101,16 @@ public class EgovJwtTokenUtil implements Serializable{
.setClaims(claims)
.setSubject("Authorization")
.setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + JWT_ACCESS_TOKEN_VALIDITY * 1000))
.setExpiration(new Date(System.currentTimeMillis() + sec))
.signWith(Keys.hmacShaKeyFor(SECRET_KEY.getBytes(StandardCharsets.UTF_8)), SignatureAlgorithm.HS512);
return builder.compact();
}
public String generateAccessToken(UserInfo loginVO) {
return generateToken(loginVO, JWT_ACCESS_TOKEN_SEC);
}
@Transactional
public String generateRefreshTokenToken(UserInfo loginVO){
RefreshToken refreshToken = new RefreshToken(loginVO.getUserSeq(), UUID.randomUUID().toString());
RefreshToken refreshToken = new RefreshToken(loginVO.getUserSeq(), generateToken(loginVO, JWT_REFRESH_TOKEN_SEC));
refreshTokenRepository.save(refreshToken);
return refreshToken.getRefreshToken();
}

View File

@ -10,7 +10,7 @@ import org.springframework.data.redis.core.index.Indexed;
@Getter
@AllArgsConstructor
@NoArgsConstructor
@RedisHash(value="refreshToken", timeToLive = 60) // *60*24*14
@RedisHash(value="refreshToken", timeToLive = 60*60*24*14)
public class RefreshToken {
@Id

View File

@ -58,10 +58,8 @@ public class CustomUrlAuthenticationSuccessHandler extends SimpleUrlAuthenticati
securityUser.setUserSeq(null);
HashMap<String, Object> resultMap = new HashMap<String, Object>();
resultMap.put("resultCode", "200");
resultMap.put("resultVO", (UserDetails)securityUser);
resultMap.put("refreshToken", refreshToken);
resultMap.put("jToken", jwtToken);
// String userName = jwtTokenUtil.getUserSeFromToken(jwtToken);
response.addHeader("Authorization", "BEARER "+jwtToken);
if (jsonConverter.canWrite(resultMap.getClass(), jsonMimeType)) {
jsonConverter.write(resultMap, jsonMimeType, new ServletServerHttpResponse(response));