카테고리 없음

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형식으로 사용할수 있습니다.