로그인 정보 저장 위치 수정.

jwt 보완중.
cks
강석 최 2023-12-15 18:00:46 +09:00
parent 9d1937a81d
commit 1a35c995d9
9 changed files with 35 additions and 20 deletions

View File

@ -3,6 +3,7 @@ import { SERVER_URL } from '../config';
import URL from 'constants/url';
import CODE from 'constants/code';
import { getSessionItem, setSessionItem } from 'utils/storage';
import { getLocalItem, setLocalItem } from 'utils/storage';
export function getQueryString(params){
return `?${Object.entries(params).map(e => e.join('=')).join('&') }`
@ -14,9 +15,10 @@ export function requestFetch(url, requestOptions, handler, errorHandler) {
console.log("requestFetch [requestOption] : ", requestOptions);
// Login 했을경우 JWT 설정
const sessionUser = getSessionItem('loginUser');
const sessionUser = getLocalItem('loginUser');
const sessionUserId = sessionUser?.userId || null;
const jToken = getSessionItem('jToken');
const jToken = getLocalItem('jToken');
const refreshToken = getLocalItem('refreshToken');
if(sessionUserId != null && sessionUserId !== undefined){
if( !requestOptions['headers'] ) requestOptions['headers']={}
if( !requestOptions['headers']['Authorization'] ) requestOptions['headers']['Authorization']=null;

View File

@ -6,12 +6,13 @@ import * as EgovNet from 'api/egovFetch';
import URL from 'constants/url';
import CODE from 'constants/code';
import { getSessionItem, setSessionItem } from 'utils/storage';
import { getLocalItem, setLocalItem } from 'utils/storage';
function EgovHeader({ loginUser, onChangeLogin }) {
console.group("EgovHeader");
console.log("[Start] EgovHeader ------------------------------");
const sessionUser = getSessionItem('loginUser');
const sessionUser = getLocalItem('loginUser');
const sessionUserId = sessionUser?.userId;
const sessionUserSe = sessionUser?.userSe;
@ -38,8 +39,9 @@ function EgovHeader({ loginUser, onChangeLogin }) {
console.log("===>>> logout resp= ", resp);
if (parseInt(resp.resultCode) === parseInt(CODE.RCV_SUCCESS)) {
onChangeLogin({ loginVO: {} });
setSessionItem('loginUser', {"id":""});
setSessionItem('jToken', null);
setLocalItem('loginUser', {"id":""});
setLocalItem('jToken', null);
setLocalItem('refreshToken', null);
window.alert("로그아웃되었습니다!");
navigate(URL.MAIN);
// PC Mobile : 2023.04.13()

View File

@ -76,12 +76,16 @@ function EgovLoginContent(props) {
(resp) => {
let resultVO = resp.resultVO;
let jToken = resp?.jToken || null;
let refreshToken = resp?.refreshToken || null;
setSessionItem('jToken', jToken);
// setSessionItem('jToken', jToken);
setLocalItem('jToken', jToken);
setLocalItem('refreshToken', refreshToken);
debugger
if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) {
setLoginVO(resultVO);
setSessionItem('loginUser', resultVO);
// setSessionItem('loginUser', resultVO);
setLocalItem('loginUser', resultVO);
props.onChangeLogin(resultVO);
if (saveIDFlag) setLocalItem(KEY_ID, resultVO?.id);
navigate(URL.MAIN);

View File

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

View File

@ -45,6 +45,7 @@ import java.util.UUID;
*/
//security 관련 제외한 jwt util 클래스
@Slf4j
@RequiredArgsConstructor
@Component
public class EgovJwtTokenUtil implements Serializable{
@ -52,8 +53,8 @@ public class EgovJwtTokenUtil implements Serializable{
//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 String SECRET_KEY = EgovProperties.getProperty("Globals.jwt.secret");
@Autowired
private RefreshTokenRepository refreshTokenRepository;
private final RefreshTokenRepository refreshTokenRepository;
//retrieve username from jwt token
@ -107,9 +108,7 @@ public class EgovJwtTokenUtil implements Serializable{
@Transactional
public String generateRefreshTokenToken(UserInfo loginVO){
RefreshToken refreshToken = new RefreshToken();
refreshToken.setRefreshToken(UUID.randomUUID().toString());
refreshToken.setUserSeq(loginVO.getUserSeq());
RefreshToken refreshToken = new RefreshToken(loginVO.getUserSeq(), UUID.randomUUID().toString());
refreshTokenRepository.save(refreshToken);
return refreshToken.getRefreshToken();
}

View File

@ -3,18 +3,18 @@ package com.dbnt.kcscbackend.config.jwt.redis;
import lombok.*;
import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;
import org.springframework.data.redis.core.index.Indexed;
@Builder
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@RedisHash(value="refreshToken", timeToLive = 60) // *60*24*14
public class RefreshToken {
@Id
private String refreshToken;
private Integer userSeq;
@Indexed
private String refreshToken;
}

View File

@ -3,6 +3,9 @@ package com.dbnt.kcscbackend.config.jwt.redis;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import java.util.Optional;
@Repository
public interface RefreshTokenRepository extends CrudRepository<RefreshToken, String> {
Optional<RefreshToken> findByRefreshToken(String refreshToken);
}

View File

@ -2,6 +2,7 @@ package com.dbnt.kcscbackend.config.security;
import com.dbnt.kcscbackend.auth.entity.UserInfo;
import com.dbnt.kcscbackend.config.jwt.EgovJwtTokenUtil;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
@ -21,10 +22,11 @@ import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
@RequiredArgsConstructor
@Configuration
public class CustomUrlAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
private final EgovJwtTokenUtil jwtTokenUtil = new EgovJwtTokenUtil();
private final EgovJwtTokenUtil jwtTokenUtil;
private RequestCache requestCache = new HttpSessionRequestCache();
@Override

View File

@ -3,6 +3,7 @@ package com.dbnt.kcscbackend.config.security;
import com.dbnt.kcscbackend.config.jwt.EgovJwtTokenUtil;
import com.dbnt.kcscbackend.config.jwt.JwtAuthenticationEntryPoint;
import com.dbnt.kcscbackend.config.jwt.JwtAuthenticationFilter;
import com.dbnt.kcscbackend.config.jwt.redis.RefreshTokenRepository;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
@ -48,6 +49,7 @@ public class SecurityConfig {
@Resource(name = "loginService")
private UserDetailsService loginService;
private final ObjectMapper objectMapper;
private final RefreshTokenRepository refreshTokenRepository;
//Http Methpd : Get 인증예외 List
private String[] AUTH_GET_WHITELIST = {
@ -139,7 +141,8 @@ public class SecurityConfig {
@Bean
public JsonAuthenticationFilter jsonUsernamePasswordAuthenticationFilter() {
JsonAuthenticationFilter jsonAuthenticationFilter = new JsonAuthenticationFilter(objectMapper, new CustomUrlAuthenticationSuccessHandler(), loginFailureHandler());
EgovJwtTokenUtil jwtTokenUtil = new EgovJwtTokenUtil(refreshTokenRepository);
JsonAuthenticationFilter jsonAuthenticationFilter = new JsonAuthenticationFilter(objectMapper, new CustomUrlAuthenticationSuccessHandler(jwtTokenUtil), loginFailureHandler());
jsonAuthenticationFilter.setAuthenticationManager(authenticationManager());
return jsonAuthenticationFilter;
}