카테고리 없음
jwttoken API
멈추지않아
2022. 10. 9. 18:02
깃허브:https://github.com/kimdhj/teamProject
pom.xml
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-impl -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-jackson -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
이렇게 세개를 추가해줍니다.
package com.romance.security;
import java.io.IOException;
import java.io.Reader;
import java.time.Duration;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import javax.servlet.http.HttpSession;
import org.apache.ibatis.io.Resources;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.romance.admin.login.AdminUserVO;
import com.romance.user.login.UserVO;
import io.jsonwebtoken.Header;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
public class JwtUtils {
private String key;
// jwt 토큰 생성
// ==토큰 생성 메소드==//
public String createToken(String subject, UserVO vo) throws IOException {
String resource = "config/token.properties";
Properties properties = new Properties();
Reader reader = Resources.getResourceAsReader(resource);
properties.load(reader);
key=properties.getProperty("key");
Date now = new Date();
Date expiration = new Date(now.getTime() + Duration.ofDays(1).toMillis()); // 만료기간 1일
Map<String, Object> payloads = new HashMap<>();
payloads.put("user", vo);
return Jwts.builder().setHeaderParam(Header.TYPE, Header.JWT_TYPE) // (1)
.setIssuer("doublejo") // 토큰발급자(iss)
.setIssuedAt(now) // 발급시간(iat)
.setExpiration(expiration) // 만료시간(exp)
.setSubject(subject).setClaims(payloads)// 토큰 제목(subject)
.signWith(SignatureAlgorithm.HS256, Base64.getEncoder().encodeToString(key.getBytes())) // 알고리즘, 시크릿 키
.compact();
}
// ==Jwt 토큰의 유효성 체크 메소드==//
public Map<String, Object> parseJwtToken(String token) throws IOException {
String resource = "config/token.properties";
Properties properties = new Properties();
Reader reader = Resources.getResourceAsReader(resource);
properties.load(reader);
key=properties.getProperty("key");
// token = BearerRemove(token); // Bearer 제거
return Jwts.parser().setSigningKey(Base64.getEncoder().encodeToString(key.getBytes())).parseClaimsJws(token)
.getBody();
}
// ==토큰 앞 부분('Bearer') 제거 메소드==//
private String BearerRemove(String token) {
return token.substring("Bearer ".length());
}
public UserVO getuser(HttpSession session) throws IOException {
String token = (String) session.getAttribute("id");
if (token != null) {
Map<String, Object> con = parseJwtToken(token);
ObjectMapper mapper = new ObjectMapper();
UserVO vo = mapper.convertValue(con.get("user"), UserVO.class);
System.out.println("세션 등록 유저 정보" + vo);
return vo;
} else {
return null;
}
}
}
먼저 토큰을 생성 하는 create 토큰을 보면
String resource = "config/token.properties";
Properties properties = new Properties();
Reader reader = Resources.getResourceAsReader(resource);
properties.load(reader);
key=properties.getProperty("key");
여기가 properties 파일에서 제가 만든 암호화의 기준이되는 글자 한줄을 가져오는 코드입니다.
Date now = new Date();
Date expiration = new Date(now.getTime() + Duration.ofDays(1).toMillis());
여기서 만료기간을 하루로 설정해주고
Map<String, Object> payloads = new HashMap<>();
payloads.put("user", vo);
map형식으로 우리가 저장할 데이터를 저장해주게 됩니다.
return Jwts.builder().setHeaderParam(Header.TYPE, Header.JWT_TYPE) // (1)
.setIssuer("doublejo") // 토큰발급자(iss)
.setIssuedAt(now) // 발급시간(iat)
.setExpiration(expiration) // 만료시간(exp)
.setSubject(subject).setClaims(payloads)// 토큰 제목(subject)
.signWith(SignatureAlgorithm.HS256, Base64.getEncoder().encodeToString(key.getBytes())) // 알고리즘, 시크릿 키
.compact();
여기서 만료시간 토큰제목 등 여러가지 토큰 정보를 설정하고 만들어지게 됩니다.
그러고나서 이 토큰 String을 세션에 저장을하게 합니다.
그리도 나중에 해독을 할때는
public UserVO getuser(HttpSession session) throws IOException {
String token = (String) session.getAttribute("id");
if (token != null) {
Map<String, Object> con = parseJwtToken(token);
ObjectMapper mapper = new ObjectMapper();
UserVO vo = mapper.convertValue(con.get("user"), UserVO.class);
System.out.println("세션 등록 유저 정보" + vo);
return vo;
} else {
return null;
}
}
세션에서 id라는 이름으로 저장되있는 토큰 값을 가져오고
public Map<String, Object> parseJwtToken(String token) throws IOException {
String resource = "config/token.properties";
Properties properties = new Properties();
Reader reader = Resources.getResourceAsReader(resource);
properties.load(reader);
key=properties.getProperty("key");
// token = BearerRemove(token); // Bearer 제거
return Jwts.parser().setSigningKey(Base64.getEncoder().encodeToString(key.getBytes())).parseClaimsJws(token)
.getBody();
}
여기서 properties파일에 저장되있는 key로 유효성 검사를 하고 map형식으로 리턴해줍니다.
map형식인것을 ObjectMapper를 활용하여 VO로 변경하여 return하게 해줍니다.
이렇게 하면 저장될때는 토큰형식으로 암호화 되어있고 우리가 나중에 사용할때는 VO형식으로 사용할수 있습니다.