본문 바로가기

JAVA/Spring

[Spring] boot 에서 JWT 인증 토큰 생성 및 사용하기

 

 

 

1. JWT 인증

 

Json Web Token

인증에 필요한 정보들을 토큰에 담아 암호화시켜 사용하는 방식이다.

서명된 토큰이라는 점에서 쿠키보다 더 보안성이 높다.

 

JWT의 구조
Header, Payload, Signature의 구성 요소로 이루어지며 각 구성 요소가 마침표(.)로 구분된다.

 

Header - 토큰의 타입이나, 서명 생성에 사용되는 알고리즘을 저장한다.
Payload - 토큰에 담을 정보를 key-value 형태로 저장한다.
Signature - 서명이 저장되는데 암호화되어 있기 때문에 서버에 있는 개인 키로만 복호화가 가능하다.

 

 

 

 

2. JWT 생성

 

 

1) dependencies 추가

 

<!-- jjwt -->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

<!-- spring-security-jwt -->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-jwt</artifactId>
    <version>1.0.10.RELEASE</version>
</dependency>

 

 


2) createJwt 메소드에서 builder 패턴을 이용해 JWT를 생성

 

 

setHeaderParam() - type 설정

claim() - Payload에 담을 데이터를 입력

setIssuedAt() - 발급 시간 입력

setExpiration() - 해당 JWT의 만료 시간 입력

signWith() - 서명 알고리즘과 비밀 키 입력

                     서명 알고리즘으로 HS256을 선택한다면 비밀 키는 별도의 클래스에서 관리한다.

                     깃 허브에 올릴 때는 해당 파일을 .gitignore에 추가하기

compact() - 설정대로 JWT 토큰을 생성

 

 

public String createToken(Authentication authentication) {
    String authorities = authentication.getAuthorities().stream()
            .map(GrantedAuthority::getAuthority)
            .collect(Collectors.joining(","));

    long now = (new Date()).getTime();
    Date validity = new Date(now + this.tokenValidityInMilliseconds);

    return Jwts.builder()
            .setSubject(authentication.getName())
            .claim(AUTHORITIES_KEY, authorities)
            .signWith(key, SignatureAlgorithm.HS512)
            .setExpiration(validity)
            .compact();
}

 

 

 

// 내가 구현한 코드

 

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    String clientIP = getClientIpAddr(request);
    String token = request.getHeader("Authorization");
    String requestURI = request.getRequestURI();

    // Token 유효성 체크
    if (token != null && token.startsWith("Bearer ")) {
        token = token.replace("Bearer ", "");

        PublicKey publicKey;
        publicKey = cache.getPublicKey(applicationOauth.getPublicKey());

        // JWT 파싱
        Jws<Claims> claims;
        claims = Jwts.parser().setSigningKey(publicKey).parseClaimsJws(token);

        Claims body = claims.getBody();
        userId = String.valueOf(body.get("userId"));

        //구현할 코드 입력
        .
        .
        .
    }
    else {
        // 인증 토큰 없음 - 401 에러
        response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Target of URI doesn't exist.");
        return false;
    }
    return true;
}

 

 

 

request.header 에서 token 정보를 받아 해당 토큰의 유효성을 검사하고 JWT 를 파싱한다.

이후 파싱 된 데이터로 원하는 코드를 구현하면 된다.

 

발급 된 토큰 정보는 jwt.io 에서 확인 가능하다.