From a588ca3f59af8bb36fce79b2d2424886484542d4 Mon Sep 17 00:00:00 2001 From: kkw29 Date: Thu, 8 Jun 2023 09:43:09 +0900 Subject: [PATCH] =?UTF-8?q?JWT=20=EC=9E=91=EC=97=85=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 43 +++++ main_vm/build.gradle | 8 + .../login/controller/LoginController.class | Bin 8760 -> 8737 bytes .../common/login/service/LoginService.class | Bin 26390 -> 28855 bytes .../resources/main/application-local.yml | 5 +- .../biz/common/login/CinnamonToken.java | 15 ++ .../biz/common/login/TokenProvider.java | 153 ++++++++++++++++++ .../login/controller/LoginController.java | 2 +- .../common/login/service/LoginService.java | 82 +++++++++- .../src/main/resources/application-local.yml | 5 +- .../static/aajs/statisticsDashboard.js | 6 + .../templates/layout/fragments/head.html | 63 +++++++- .../resources/templates/layout/signin.html | 5 +- 13 files changed, 373 insertions(+), 14 deletions(-) create mode 100644 .gitignore create mode 100644 main_vm/src/main/java/com/icomsys/main_vm/biz/common/login/CinnamonToken.java create mode 100644 main_vm/src/main/java/com/icomsys/main_vm/biz/common/login/TokenProvider.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7814793 --- /dev/null +++ b/.gitignore @@ -0,0 +1,43 @@ +HELP.md +.gradle +.idea +build/ +**/.gradle +**/.idea +**/build + +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath + +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ diff --git a/main_vm/build.gradle b/main_vm/build.gradle index 91dea0f..bed2430 100644 --- a/main_vm/build.gradle +++ b/main_vm/build.gradle @@ -129,6 +129,14 @@ dependencies { implementation files("lib/ASRLIB-2.4.0.2.jar") implementation files("lib/pttsnet_class.jar") + + // jwt + implementation 'io.jsonwebtoken:jjwt-api:0.11.5' + implementation 'io.jsonwebtoken:jjwt-impl:0.11.5' + implementation 'io.jsonwebtoken:jjwt-jackson:0.11.5' + + //자바 역직렬화 문제 해결 패키지 + implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310' } tasks.named('test') { diff --git a/main_vm/build/classes/java/main/com/icomsys/main_vm/biz/common/login/controller/LoginController.class b/main_vm/build/classes/java/main/com/icomsys/main_vm/biz/common/login/controller/LoginController.class index 3cd4881eae59f61477757350c175e7bed28a6291..016a213d371d3b16c4d50c97d96dc774623f0fe4 100644 GIT binary patch delta 33 ncmdntve0G2H5MixjmZsMT9eaR`6h2*7iF{n@iwQkUX%d<$-@gF delta 42 ucmZ4JvcqM=H5R61jmd>P8k1OsCSPI`nXDix%wo;RU;z;m*c``tSOx$m9Snc~ diff --git a/main_vm/build/classes/java/main/com/icomsys/main_vm/biz/common/login/service/LoginService.class b/main_vm/build/classes/java/main/com/icomsys/main_vm/biz/common/login/service/LoginService.class index 982041781566643312b9d567b56831f5889929a7..a0f7e0051a3a296c6e6adc92f0cdbc72e5a8798d 100644 GIT binary patch literal 28855 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 LFVE3fe)#_YbEof6 delta 9727 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 diff --git a/main_vm/build/resources/main/application-local.yml b/main_vm/build/resources/main/application-local.yml index 5c7a9a3..2dc72ce 100644 --- a/main_vm/build/resources/main/application-local.yml +++ b/main_vm/build/resources/main/application-local.yml @@ -29,6 +29,9 @@ spring: dialect: com.icomsys.main_vm.common.util.CustomDialect generate_statistics: true + jwt: + secret: f2d7e5002d67c8d118ebf800274b6a5c83ed7b3d3518b2cddcd7226f7484eb34 + #https://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/dialect/package-summary.html feign: @@ -56,4 +59,4 @@ Globals: # stack: # auto: false # region: -# static: ap-northeast-2 \ No newline at end of file +# static: ap-northeast-2 diff --git a/main_vm/src/main/java/com/icomsys/main_vm/biz/common/login/CinnamonToken.java b/main_vm/src/main/java/com/icomsys/main_vm/biz/common/login/CinnamonToken.java new file mode 100644 index 0000000..635a17f --- /dev/null +++ b/main_vm/src/main/java/com/icomsys/main_vm/biz/common/login/CinnamonToken.java @@ -0,0 +1,15 @@ +package com.icomsys.main_vm.biz.common.login; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Builder +@Data +@AllArgsConstructor +public class CinnamonToken { + + private String grantType; + private String accessToken; + private String refreshToken; +} diff --git a/main_vm/src/main/java/com/icomsys/main_vm/biz/common/login/TokenProvider.java b/main_vm/src/main/java/com/icomsys/main_vm/biz/common/login/TokenProvider.java new file mode 100644 index 0000000..71b0f41 --- /dev/null +++ b/main_vm/src/main/java/com/icomsys/main_vm/biz/common/login/TokenProvider.java @@ -0,0 +1,153 @@ +package com.icomsys.main_vm.biz.common.login; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.icomsys.main_vm.db.jpa.entity.system.TbBotUser; +import com.icomsys.main_vm.db.jpa.repo.system.TbUserAuthGroupRepo; +import io.jsonwebtoken.*; +import io.jsonwebtoken.io.Decoders; +import io.jsonwebtoken.security.Keys; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletResponse; +import java.security.Key; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; +import java.util.stream.Collectors; + + +@Slf4j +@Component +public class TokenProvider { + private final TbUserAuthGroupRepo tbUserAuthGroupRepo; + + private static final long ACCESS_TOKEN_EXPIRE_TIME = 20 * 60 * 1000L; + private static final long REFRESH_TOKEN_EXPIRE_TIME = 24 * 60 * 60 * 1000L; + + private final Key key; + + public TokenProvider(@Value("${spring.jwt.secret}") String secretKey, TbUserAuthGroupRepo tbUserAuthGroupRepo) { + this.tbUserAuthGroupRepo = tbUserAuthGroupRepo; + byte[] keyBytes = Decoders.BASE64.decode(secretKey); + this.key = Keys.hmacShaKeyFor(keyBytes); + } + + public String generateToken(Authentication authentication, TbBotUser user) throws JsonProcessingException { + // 권한 가져오기 + String authorities = authentication.getAuthorities().stream() + .map(GrantedAuthority::getAuthority) + .collect(Collectors.joining(",")); + + long now = (new Date()).getTime(); + // Access Token 생성 + // Todo: Access Token 필요정보 추가 개발 필요 + Date accessTokenExpiresIn = new Date(now + ACCESS_TOKEN_EXPIRE_TIME); // Todo: Access Token 만료 기간 설정 파일 추가 + + Claims claims = Jwts.claims() + .setSubject(authentication.getName()) + .setExpiration(accessTokenExpiresIn); + + claims.put("auth", authorities); + + ObjectMapper mapper = new ObjectMapper(); + + // claims.put("UserVO", mapper.registerModule(new JavaTimeModule()).writeValueAsString(user.toUserVO())); + try { + JavaTimeModule javaTimeModule = new JavaTimeModule(); + + LocalDateTimeSerializer localDateTimeSerializer = new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + + javaTimeModule.addSerializer(LocalDateTime.class, localDateTimeSerializer); + + // claims.put("UserVO", mapper.registerModule(javaTimeModule).readValue(user.toUserVO(), UserVo.class)); + claims.put("UserVO", mapper.registerModule(javaTimeModule).writeValueAsString(user.toUserVO())); + // claims.put("PolicyList", tbUserAuthGroupRepo.userPolicyListSelect(user.getUserSeq(), user.getLastUseServiceGroup())); + } + catch (Exception e) { + e.printStackTrace(); + } + + String accessToken = Jwts.builder() + .setSubject(authentication.getName()) + .setClaims(claims) + .setExpiration(accessTokenExpiresIn) + .signWith(key, SignatureAlgorithm.HS256) + .compact(); + + // Refresh Token 생성 + String refreshToken = Jwts.builder() + .setExpiration(new Date(now + REFRESH_TOKEN_EXPIRE_TIME)) // Todo: Refresh Token 만료 기간 설정 파일에 추가 + .signWith(key, SignatureAlgorithm.HS256) + .compact(); + + CinnamonToken token = CinnamonToken.builder() + .grantType("Bearer") + .accessToken(accessToken) + .refreshToken(refreshToken) + .build(); + + return accessToken; + } + + // JWT 토큰을 복호화하여 토큰에 들어있는 정보를 꺼내는 메서드 + public Authentication getAuthentication(String accessToken) { + // 토큰 복호화 + Claims claims = parseClaims(accessToken); + + // Todo: 권한 관련 정보 처리 + if (claims.get("auth") == null) { + throw new RuntimeException("권한 정보가 없는 토큰입니다."); + } + + // Todo: 사용자 정보와 권한 관련 정보를 읽어와 리턴 + + // 클레임에서 권한 정보 가져오기 + Collection authorities = + Arrays.stream(claims.get("auth").toString().split(",")) + .map(SimpleGrantedAuthority::new) + .collect(Collectors.toList()); + + // UserDetails 객체를 만들어서 Authentication 리턴 + // UserDetails principal = new User(claims.getSubject(), "", authorities); + return new UsernamePasswordAuthenticationToken(/*principal*/ "", "", authorities); + } + + // 토큰 정보를 검증하는 메서드 + public boolean validateToken(String token) { + // Todo: 내부 토큰 사용 정책에 따라 추후 수정 필요!! + try { + Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token); + return true; + } catch (io.jsonwebtoken.security.SecurityException | MalformedJwtException e) { + log.info("Invalid JWT Token", e); + } catch (ExpiredJwtException e) { + log.info("Expired JWT Token", e); + } catch (UnsupportedJwtException e) { + log.info("Unsupported JWT Token", e); + } catch (IllegalArgumentException e) { + log.info("JWT claims string is empty.", e); + } + return false; + } + + public Claims parseClaims(String accessToken) { + try { + return Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(accessToken).getBody(); + } catch (ExpiredJwtException e) { + return e.getClaims(); + } + } + +} diff --git a/main_vm/src/main/java/com/icomsys/main_vm/biz/common/login/controller/LoginController.java b/main_vm/src/main/java/com/icomsys/main_vm/biz/common/login/controller/LoginController.java index 729da2c..c499c5b 100644 --- a/main_vm/src/main/java/com/icomsys/main_vm/biz/common/login/controller/LoginController.java +++ b/main_vm/src/main/java/com/icomsys/main_vm/biz/common/login/controller/LoginController.java @@ -59,7 +59,7 @@ public class LoginController { @PostMapping("/adm/main/check") @ResponseBody - public ResponseEntity loginCheck(@RequestBody LoginCheckReq dto) throws CustomNotFoundException, CustomBadRequestException { + public String loginCheck(@RequestBody LoginCheckReq dto) throws CustomNotFoundException, CustomBadRequestException { return loginService.loginCheck(dto); } diff --git a/main_vm/src/main/java/com/icomsys/main_vm/biz/common/login/service/LoginService.java b/main_vm/src/main/java/com/icomsys/main_vm/biz/common/login/service/LoginService.java index c4a6afc..c162812 100644 --- a/main_vm/src/main/java/com/icomsys/main_vm/biz/common/login/service/LoginService.java +++ b/main_vm/src/main/java/com/icomsys/main_vm/biz/common/login/service/LoginService.java @@ -1,10 +1,15 @@ package com.icomsys.main_vm.biz.common.login.service; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.google.gson.Gson; import com.icomsys.main_vm.biz.advice.excep.CustomBadRequestException; import com.icomsys.main_vm.biz.advice.excep.CustomNotFoundException; import com.icomsys.main_vm.biz.common.common.service.LogService; import com.icomsys.main_vm.biz.common.common.service.LogVO; +import com.icomsys.main_vm.biz.common.login.CinnamonToken; +import com.icomsys.main_vm.biz.common.login.TokenProvider; import com.icomsys.main_vm.biz.common.login.req.LoginReq; import com.icomsys.main_vm.biz.common.login.req.MainOprReq; import com.icomsys.main_vm.biz.common.login.req.PwdUpdateReq; @@ -20,6 +25,7 @@ import com.icomsys.main_vm.db.jpa.entity.conversation.TbIcsLog; import com.icomsys.main_vm.db.jpa.entity.system.TbBotUser; import com.icomsys.main_vm.db.jpa.repo.system.*; import com.icomsys.main_vm.db.mybatis.alias.LoginVO; +import io.jsonwebtoken.Claims; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.context.MessageSource; @@ -37,6 +43,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.ui.ModelMap; +import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @@ -70,6 +77,8 @@ public class LoginService { private final ClientIp clientIp; + private final TokenProvider tokenProvider; + //LoginVo의 경우 Egov 레거시매퍼의존성이 잡혀있어. req에 분리 불가능 @Transactional public String LoginValidService(LoginReq dto, ModelMap model) { @@ -125,7 +134,10 @@ public class LoginService { List menuVos = new ArrayList<>(); String url = ""; // LoginVO loginVO = (LoginVO) httpServletRequest.getSession().getAttribute(SessionResource.LoginVO.getName()); - UserVo userVo = (UserVo) httpServletRequest.getSession().getAttribute(SessionResource.UserVO.getName()); + +// UserVo userVo = (UserVo) httpServletRequest.getSession().getAttribute(SessionResource.UserVO.getName()); + UserVo userVo = getUserVo(); + log.info("action main session uservo- {}", new Gson().toJson(userVo)); // if (loginVO != null && loginVO.getUserId() != null && !loginVO.getUserId().equals("")) { if (userVo != null && userVo.getUserId() != null && !userVo.getUserId().equals("")) { @@ -160,7 +172,48 @@ public class LoginService { } public UserVo getUserVo() { - UserVo user = (UserVo) httpServletRequest.getSession().getAttribute(SessionResource.UserVO.getName()); + String payloadJWT = ""; + String accessToken = ""; + + // String bearerToken = httpServletRequest.getHeader("Authorization"); + // + // if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer")) { + // payload = bearerToken.substring(7); + // } + + // todo request header에서 token 값 가져오기 + Cookie[] cookies = httpServletRequest.getCookies(); + + if(cookies!=null){ + for (Cookie c : cookies) { + String name = c.getName(); // 쿠키 이름 가져오기 + String value = c.getValue(); // 쿠키 값 가져오기 + if (name.equals("accessToken")) { + payloadJWT = value.split("[.]")[1]; + accessToken = value; + } + } + } + + Claims claims = tokenProvider.parseClaims(accessToken); + + // Base64.Decoder decoder = Base64.getUrlDecoder(); + // final String payload = new String(decoder.decode(payloadJWT)); + // JsonParser jsonParser = new BasicJsonParser(); + // Map jsonArray = jsonParser.parseMap(payload); + + Gson gson =new Gson(); + Map map =new HashMap(); + // map = gson.fromJson((String) jsonArray.get("UserVO"), map.getClass()); + map = gson.fromJson((String) claims.get("UserVO"), map.getClass()); + + map.put("registDate", map.get("registDate").toString().replace(" ", "T")); + map.put("updateDate", map.get("updateDate").toString().replace(" ", "T")); + + ObjectMapper objectMapper = new ObjectMapper(); + UserVo user = objectMapper.registerModule(new JavaTimeModule()).convertValue(map, UserVo.class); + +// UserVo user = (UserVo) httpServletRequest.getSession().getAttribute(SessionResource.UserVO.getName()); // if (user == null || user.equals("")) { // httpServletResponse.setStatus(401); // } @@ -354,8 +407,13 @@ public class LoginService { } @Transactional - public ResponseEntity loginCheck(LoginCheckReq dto) throws CustomNotFoundException, CustomBadRequestException { + public String loginCheck(LoginCheckReq dto) throws CustomNotFoundException, CustomBadRequestException { + // 1. Login ID/PW 를 기반으로 Authentication 객체 생성 + // 이때 authentication 는 인증 여부를 확인하는 authenticated 값이 false + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(dto.getUserId(), dto.getPassword()); + TbBotUser user = tbBotUserRepo.findByUserId(dto.getUserId()).orElseThrow(() -> new CustomNotFoundException()); + if (user.getLoginCheck() >= 5) { throw new CustomBadRequestException(); } @@ -363,7 +421,7 @@ public class LoginService { throw new CustomBadRequestException(); } if (LocalDateTime.now().isAfter(user.getUpdateDate().plusDays(90))) { - return ResponseEntity.status(401).build(); + ResponseEntity.status(401).build(); } if (!passwordEncoder.matches(dto.getPassword(), user.getPassword())) { user.loginFailCheck(); @@ -386,8 +444,22 @@ public class LoginService { ); user.resetLoginFailCheck(); + + ResponseEntity.ok().build(); + + // 2. 실제 검증 (사용자 비밀번호 체크)이 이루어지는 부분 + // authenticate 매서드가 실행될 때 CustomUserDetailsService 에서 만든 loadUserByUsername 메서드가 실행 + try { + Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken); + + // 3. 인증 정보를 기반으로 JWT 토큰 생성 + String accessToken = tokenProvider.generateToken(authentication, user); + + return accessToken; + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } } - return ResponseEntity.ok().build(); } diff --git a/main_vm/src/main/resources/application-local.yml b/main_vm/src/main/resources/application-local.yml index 5c7a9a3..2dc72ce 100644 --- a/main_vm/src/main/resources/application-local.yml +++ b/main_vm/src/main/resources/application-local.yml @@ -29,6 +29,9 @@ spring: dialect: com.icomsys.main_vm.common.util.CustomDialect generate_statistics: true + jwt: + secret: f2d7e5002d67c8d118ebf800274b6a5c83ed7b3d3518b2cddcd7226f7484eb34 + #https://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/dialect/package-summary.html feign: @@ -56,4 +59,4 @@ Globals: # stack: # auto: false # region: -# static: ap-northeast-2 \ No newline at end of file +# static: ap-northeast-2 diff --git a/main_vm/src/main/resources/static/aajs/statisticsDashboard.js b/main_vm/src/main/resources/static/aajs/statisticsDashboard.js index cf38077..2789f30 100644 --- a/main_vm/src/main/resources/static/aajs/statisticsDashboard.js +++ b/main_vm/src/main/resources/static/aajs/statisticsDashboard.js @@ -24,6 +24,7 @@ var StatisticsDashboard = { datatype: "JSON", contentType : "application/json; charset=utf-8", url: "/adm/menu/oprmng", + headers: {'Authorization': getToken()}, data: {menuval: 'root'}, // data: {serviceType: 'S'}, success: (function(data) { @@ -70,6 +71,7 @@ var StatisticsDashboard = { datatype: "JSON", contentType : "application/json; charset=utf-8", url: "/admin/common/dashboard/callinfolist.do", + headers: {'Authorization': getToken()}, data: JSON.stringify(param), success: (function(data) { StatisticsDashboard.totCallList = []; @@ -107,6 +109,7 @@ var StatisticsDashboard = { datatype: "JSON", contentType : "application/json; charset=utf-8", url: "/admin/common/dashboard/intentlist.do", + headers: {'Authorization': getToken()}, data: JSON.stringify(param), success: (function(data) { StatisticsDashboard.totIntentList = []; @@ -144,6 +147,7 @@ var StatisticsDashboard = { datatype: "JSON", contentType : "application/json; charset=utf-8", url: "/admin/common/dashboard/scenariolist.do", + headers: {'Authorization': getToken()}, data: JSON.stringify(param), success: (function(data) { StatisticsDashboard.useScenarioList = []; @@ -194,6 +198,7 @@ var StatisticsDashboard = { datatype: "JSON", contentType : "application/json; charset=utf-8", url: "/admin/common/dashboard/callcntlist.do", + headers: {'Authorization': getToken()}, data: JSON.stringify(param), success: (function(data) { StatisticsDashboard.todayCallCntList = []; @@ -222,6 +227,7 @@ var StatisticsDashboard = { datatype: "JSON", contentType : "application/json; charset=utf-8", url: "/admin/common/dashboard/curcallcnt.do", + headers: {'Authorization': getToken()}, data: JSON.stringify(param), success: (function(data) { if (data != null && data != '') { diff --git a/main_vm/src/main/resources/templates/layout/fragments/head.html b/main_vm/src/main/resources/templates/layout/fragments/head.html index 681dd82..68c418a 100644 --- a/main_vm/src/main/resources/templates/layout/fragments/head.html +++ b/main_vm/src/main/resources/templates/layout/fragments/head.html @@ -42,8 +42,65 @@ @@ -109,4 +166,4 @@ - \ No newline at end of file + diff --git a/main_vm/src/main/resources/templates/layout/signin.html b/main_vm/src/main/resources/templates/layout/signin.html index e637a59..d2f95b0 100644 --- a/main_vm/src/main/resources/templates/layout/signin.html +++ b/main_vm/src/main/resources/templates/layout/signin.html @@ -140,8 +140,7 @@ }) .complete(function (data) { if (data.status == 200) { - - //set cookie + document.cookie = 'accessToken=' + data.responseText + '; path=/;'; document.signinInfoForm.action = '/adm/main/actionSecurityLogin.do'; document.signinInfoForm.submit(); @@ -192,4 +191,4 @@ - \ No newline at end of file +