refreshToken 생성방법 변경.
parent
1a35c995d9
commit
1dbfdad1b7
|
|
@ -4,6 +4,7 @@ import URL from 'constants/url';
|
||||||
import CODE from 'constants/code';
|
import CODE from 'constants/code';
|
||||||
import { getSessionItem, setSessionItem } from 'utils/storage';
|
import { getSessionItem, setSessionItem } from 'utils/storage';
|
||||||
import { getLocalItem, setLocalItem } from 'utils/storage';
|
import { getLocalItem, setLocalItem } from 'utils/storage';
|
||||||
|
import {parseJwt} from "../utils/parseJwt";
|
||||||
|
|
||||||
export function getQueryString(params){
|
export function getQueryString(params){
|
||||||
return `?${Object.entries(params).map(e => e.join('=')).join('&') }`
|
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 sessionUser = getLocalItem('loginUser');
|
||||||
const sessionUserId = sessionUser?.userId || null;
|
const sessionUserId = sessionUser?.userId || null;
|
||||||
const jToken = getLocalItem('jToken');
|
const jToken = getLocalItem('jToken');
|
||||||
|
const userInfo = parseJwt(jToken);
|
||||||
const refreshToken = getLocalItem('refreshToken');
|
const refreshToken = getLocalItem('refreshToken');
|
||||||
if(sessionUserId != null && sessionUserId !== undefined){
|
if(sessionUserId != null && sessionUserId !== undefined){
|
||||||
if( !requestOptions['headers'] ) requestOptions['headers']={}
|
if( !requestOptions['headers'] ) requestOptions['headers']={}
|
||||||
|
|
|
||||||
|
|
@ -7,14 +7,16 @@ import URL from 'constants/url';
|
||||||
import CODE from 'constants/code';
|
import CODE from 'constants/code';
|
||||||
import { getSessionItem, setSessionItem } from 'utils/storage';
|
import { getSessionItem, setSessionItem } from 'utils/storage';
|
||||||
import { getLocalItem, setLocalItem } from 'utils/storage';
|
import { getLocalItem, setLocalItem } from 'utils/storage';
|
||||||
|
import {parseJwt} from "../utils/parseJwt";
|
||||||
|
|
||||||
function EgovHeader({ loginUser, onChangeLogin }) {
|
function EgovHeader({ loginUser, onChangeLogin }) {
|
||||||
console.group("EgovHeader");
|
console.group("EgovHeader");
|
||||||
console.log("[Start] EgovHeader ------------------------------");
|
console.log("[Start] EgovHeader ------------------------------");
|
||||||
|
|
||||||
const sessionUser = getLocalItem('loginUser');
|
const jToken = getLocalItem('jToken');
|
||||||
const sessionUserId = sessionUser?.userId;
|
const userInfo = parseJwt(jToken);
|
||||||
const sessionUserSe = sessionUser?.userSe;
|
const sessionUserId = userInfo?.id;
|
||||||
|
const sessionUserSe = userInfo?.userSe;
|
||||||
|
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import React, { useState, useEffect, useRef } from 'react';
|
import React, { useState, useEffect, useRef } from 'react';
|
||||||
import {Link, useLocation, useNavigate} from 'react-router-dom';
|
import {Link, useLocation, useNavigate} from 'react-router-dom';
|
||||||
import * as EgovNet from 'api/egovFetch';
|
import * as EgovNet from 'api/egovFetch';
|
||||||
|
import {parseJwt} from "../../utils/parseJwt";
|
||||||
|
|
||||||
import URL from 'constants/url';
|
import URL from 'constants/url';
|
||||||
import CODE from 'constants/code';
|
import CODE from 'constants/code';
|
||||||
|
|
@ -20,7 +21,6 @@ function EgovLoginContent(props) {
|
||||||
|
|
||||||
const [userInfo, setUserInfo] = useState({ username: '', password: 'default', userSe: 'USR' });
|
const [userInfo, setUserInfo] = useState({ username: '', password: 'default', userSe: 'USR' });
|
||||||
// eslint-disable-next-line no-unused-vars
|
// eslint-disable-next-line no-unused-vars
|
||||||
const [loginVO, setLoginVO] = useState({});
|
|
||||||
|
|
||||||
const [saveIDFlag, setSaveIDFlag] = useState(false);
|
const [saveIDFlag, setSaveIDFlag] = useState(false);
|
||||||
|
|
||||||
|
|
@ -74,8 +74,8 @@ function EgovLoginContent(props) {
|
||||||
EgovNet.requestFetch(loginUrl,
|
EgovNet.requestFetch(loginUrl,
|
||||||
requestOptions,
|
requestOptions,
|
||||||
(resp) => {
|
(resp) => {
|
||||||
let resultVO = resp.resultVO;
|
|
||||||
let jToken = resp?.jToken || null;
|
let jToken = resp?.jToken || null;
|
||||||
|
let resultVO = parseJwt(jToken);
|
||||||
let refreshToken = resp?.refreshToken || null;
|
let refreshToken = resp?.refreshToken || null;
|
||||||
|
|
||||||
// setSessionItem('jToken', jToken);
|
// setSessionItem('jToken', jToken);
|
||||||
|
|
@ -83,11 +83,11 @@ function EgovLoginContent(props) {
|
||||||
setLocalItem('refreshToken', refreshToken);
|
setLocalItem('refreshToken', refreshToken);
|
||||||
debugger
|
debugger
|
||||||
if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) {
|
if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) {
|
||||||
setLoginVO(resultVO);
|
|
||||||
// setSessionItem('loginUser', resultVO);
|
// setSessionItem('loginUser', resultVO);
|
||||||
setLocalItem('loginUser', resultVO);
|
|
||||||
props.onChangeLogin(resultVO);
|
props.onChangeLogin(resultVO);
|
||||||
if (saveIDFlag) setLocalItem(KEY_ID, resultVO?.id);
|
if (saveIDFlag) {
|
||||||
|
setLocalItem(KEY_ID, resultVO?.id);
|
||||||
|
}
|
||||||
navigate(URL.MAIN);
|
navigate(URL.MAIN);
|
||||||
// PC와 Mobile 열린메뉴 닫기
|
// PC와 Mobile 열린메뉴 닫기
|
||||||
document.querySelector('.all_menu.WEB').classList.add('closed');
|
document.querySelector('.all_menu.WEB').classList.add('closed');
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ import Modal from 'react-bootstrap/Modal';
|
||||||
import * as EgovNet from 'api/egovFetch';
|
import * as EgovNet from 'api/egovFetch';
|
||||||
import {getLocalItem} from "../../utils/storage";
|
import {getLocalItem} from "../../utils/storage";
|
||||||
import CODE from "../../constants/code";
|
import CODE from "../../constants/code";
|
||||||
|
import {parseJwt} from "../../utils/parseJwt";
|
||||||
|
|
||||||
function CodeViewer(props) {
|
function CodeViewer(props) {
|
||||||
const [treeLoading, setTreeLoading] = useState(true);
|
const [treeLoading, setTreeLoading] = useState(true);
|
||||||
|
|
@ -29,7 +30,7 @@ function CodeViewer(props) {
|
||||||
const [bookMarkModal, setBookMarkModal] = useState();
|
const [bookMarkModal, setBookMarkModal] = useState();
|
||||||
|
|
||||||
|
|
||||||
const sessionUser = getLocalItem('loginUser');
|
const sessionUser = parseJwt(getLocalItem('jToken'));
|
||||||
const sessionUserSe = sessionUser?.userSe;
|
const sessionUserSe = sessionUser?.userSe;
|
||||||
|
|
||||||
const handleClose = () => setShow(false);
|
const handleClose = () => setShow(false);
|
||||||
|
|
|
||||||
|
|
@ -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};
|
||||||
|
|
@ -51,7 +51,8 @@ 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_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");
|
public static final String SECRET_KEY = EgovProperties.getProperty("Globals.jwt.secret");
|
||||||
|
|
||||||
private final RefreshTokenRepository refreshTokenRepository;
|
private final RefreshTokenRepository refreshTokenRepository;
|
||||||
|
|
@ -88,11 +89,10 @@ 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 generateAccessToken(UserInfo loginVO) {
|
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("userSe", loginVO.getUserSe() );
|
claims.put("userSe", loginVO.getUserSe() );
|
||||||
claims.put("uniqId", loginVO.getUserSeq() );
|
|
||||||
claims.put("type", "Authorization");
|
claims.put("type", "Authorization");
|
||||||
|
|
||||||
log.debug("===>>> secret = "+SECRET_KEY);
|
log.debug("===>>> secret = "+SECRET_KEY);
|
||||||
|
|
@ -101,14 +101,16 @@ public class EgovJwtTokenUtil implements Serializable{
|
||||||
.setClaims(claims)
|
.setClaims(claims)
|
||||||
.setSubject("Authorization")
|
.setSubject("Authorization")
|
||||||
.setIssuedAt(new Date(System.currentTimeMillis()))
|
.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);
|
.signWith(Keys.hmacShaKeyFor(SECRET_KEY.getBytes(StandardCharsets.UTF_8)), SignatureAlgorithm.HS512);
|
||||||
return builder.compact();
|
return builder.compact();
|
||||||
}
|
}
|
||||||
|
public String generateAccessToken(UserInfo loginVO) {
|
||||||
|
return generateToken(loginVO, JWT_ACCESS_TOKEN_SEC);
|
||||||
|
}
|
||||||
@Transactional
|
@Transactional
|
||||||
public String generateRefreshTokenToken(UserInfo loginVO){
|
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);
|
refreshTokenRepository.save(refreshToken);
|
||||||
return refreshToken.getRefreshToken();
|
return refreshToken.getRefreshToken();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ import org.springframework.data.redis.core.index.Indexed;
|
||||||
@Getter
|
@Getter
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@RedisHash(value="refreshToken", timeToLive = 60) // *60*24*14
|
@RedisHash(value="refreshToken", timeToLive = 60*60*24*14)
|
||||||
public class RefreshToken {
|
public class RefreshToken {
|
||||||
|
|
||||||
@Id
|
@Id
|
||||||
|
|
|
||||||
|
|
@ -58,10 +58,8 @@ public class CustomUrlAuthenticationSuccessHandler extends SimpleUrlAuthenticati
|
||||||
securityUser.setUserSeq(null);
|
securityUser.setUserSeq(null);
|
||||||
HashMap<String, Object> resultMap = new HashMap<String, Object>();
|
HashMap<String, Object> resultMap = new HashMap<String, Object>();
|
||||||
resultMap.put("resultCode", "200");
|
resultMap.put("resultCode", "200");
|
||||||
resultMap.put("resultVO", (UserDetails)securityUser);
|
|
||||||
resultMap.put("refreshToken", refreshToken);
|
resultMap.put("refreshToken", refreshToken);
|
||||||
resultMap.put("jToken", jwtToken);
|
resultMap.put("jToken", jwtToken);
|
||||||
// String userName = jwtTokenUtil.getUserSeFromToken(jwtToken);
|
|
||||||
response.addHeader("Authorization", "BEARER "+jwtToken);
|
response.addHeader("Authorization", "BEARER "+jwtToken);
|
||||||
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));
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue