JWT-AES128 양방향 암호화

정 승 연·2023년 1월 19일
0

AES128 양방향 암호화

AES128

  • Hash 암호화와는 다르게 대칭키를 가지고 암호화와 복호화를 진행한다.
    • AES 뒤에 붙는 숫자는 대칭키의 bit수를 나타내는 것으로 AES-128인 경우 128bit의 대칭키를 쓰는 암호화 알고리즘이다.
    • 128bit == 16byte 이므로 키의 String length 가 16자리이다.
    • 키의 길이에 따라 암호화 라운드의 수만 다르므로 다른 bit를 가진 알고리즘도 구현되는 소스는 같다. 그러나 Java에서는 AES 키 길이에 제한을 두기 때문에 공식적으로 AES-128만 지원한다.
public class JwtServiceImpl implements JwtService {

    @Override
    public String createJwt(int userId) {
        Date now = new Date();
        return Jwts.builder()
                .setHeaderParam("type", "jwt")
                .claim("userId", userId)
                .setIssuedAt(now)
                .setExpiration(new Date(System.currentTimeMillis() + 1 * (1000 * 60 * 60 * 24 * 365)))
                .signWith(SignatureAlgorithm.HS256, Secret.JWT_SECRET_KEY)
                .compact();
    }

    @Override
    public String getJwt() {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
        return request.getHeader("X-ACCESS_TOKEN");
    }

    @Override
    public int getUserId() throws BaseException {

        String accessToken = getJwt();
        if (accessToken == null || accessToken.length() == 0) {
            throw new BaseException(EMPTY_JWT);
        }

        Jws<Claims> claims;
        try {
            claims = Jwts.parser()
                    .setSigningKey(Secret.JWT_SECRET_KEY)
                    .parseClaimsJws(accessToken);
        } catch (ExpiredJwtException ignored) {
            throw new BaseException(INVALID_JWT);
        }

        return claims.getBody().get("userId", Integer.class);
    }
}

JwtServiceImpl에서는 크게 2가지 토큰을 생성하는 makeJwt와 생성된 토큰을 확인하는 checkJwt로 나뉨

  • makeJwt에서 토큰 만료 기간은 현재 날짜 이후로만 가능합니다.
    • +1000 : 1000ms = 1s (1초) 추가
    • 60 : 앞의 1초와 계산되어 60초. 즉 1분을 설정.
    • 1 : 토큰 만료기간을 1분으로 지정. (필요시 분 단위로 입력하기 위해 지정 되어있음. ex) 30 분 -> * 30)
  • JWT는 총 3부분으로 각 부분은 사이 . (점)을 이용하여 구분 됨.
    • 첫 번째로 헤더에는 타입과 암호화 형태인 'HS256'로 지정

    • 두 번째로 내용에는 전달할 내용 포함. (ex. name, id 등)

    • 세 번째로 서명에는 위 쪽에서 지정한 secretKey를 Base64로 암호화하여 저장

      이렇게 만들어진 3부분을 .을 기준으로 한줄로 만들어서 토큰으로 사용

  • checkJwt에서는 실제로 요청이 들어오면 이게 정상 토큰인지 변조되지는 않았는지, 사용 기간이 만료된 오래된 토큰인지 확인하게 됩니다.
  • 복호화 방법은 위에 지정된 secretKey를 이용하게 됩니다. 그러므로 토큰을 위조해서 인증을 받을 수 없게 됩니다.

0개의 댓글

관련 채용 정보