Post

JWT Token으로 사용자 인증하기: Spring에서 간편하게 적용하는 방법

JWT 가 뭘까??


JWT 는 json web token 의 약자로 통신 할 때 인증 할 때 주로 사용하는 토큰이다! 그 특정 토큰을 사용하면 내가 그 사용자라는 것이 인증되는 것이다. 그 토큰은 아래 처럼 사용 될 수 있다.

  1. Client 가 서버에 로그인을 요청한다
  2. 서버는 DB 를 확인하여 user 가 맞는지 확인한다.
  3. 서버는 JWT 을 발급한다
  4. Client 는 Cookie 에 JWT 를 담아두고 서버에 요청시 Token 과 함께 가도록 한다.
  5. 서버는 Cookie 에 JWT를 확인하고 인증한다

Spring 에서 JWT사용해보기!


우선 pom.xml 에 jwt 관련 package 를 가져와준다

1
2
3
4
5
6
<dependencies>
    <dependency>
        <groupId>com.nimbusds</groupId>
        <artifactId>nimbus-jose-jwt</artifactId>
    </dependency>
</dependencies>

JWT 를 만들어주는 함수를 만들어보자!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public SignedJWT generateJWToken(Map<String, Object> claims, long validitySeconds) {
    String secret = "원하는 Secret"; // 여기 Secret 값은 아무도 모르게 해야한다!
    try {
        Date now = new Date();
        JWTClaimsSet.Builder claimsSet = new JWTClaimsSet.Builder();
        
        claimsSet.expirationTime(new Date(now.getTime() + validitySeconds * 1000));
        claimsSet.issueTime(now);
        claimsSet.notBeforeTime(now);
        // claimsSet 에 원하는 정보를 더 넣을 수 있다
        claims.forEach((key, value) -> claimsSet.claim(key, value));

        JWSSigner signer = new MACSigner(secret);
        SignedJWT signedJWT = new SignedJWT(new JWSHeader(JWSAlgorithm.HS256), claimsSet.build());
        signedJWT.sign(signer);
        return signedJWT;
    } catch (JOSEException e) {
        logger.warning("Unable to sign JWT: " + e.getMessage());
    }
}

위의 메소드는 이렇게 사용 하면 된다.

1
2
3
4
Map<String, String> claimsSet = new HashMap<String, String>();
claimsSet.put("Email", user.getEmail());
SignedJWT signedJWT = generateJWToken(claimsSet, 24 * 60 * 60);
String token = signedJWT.serialize();

이렇게 수령한 token 을 이제 다시 validate 해보자!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public String verifyJWT(String token) {
    String secret = "원하는 Secret"; 
    try {
        SignedJWT signedJWT = SignedJWT.parse(token);
        JWSVerifier verifier = new MACVerifier(secret.getBytes());
        if (!signedJWT.verify(verifier)) return null;
        JWTClaimsSet claimsSet = signedJWT.getJWTClaimsSet();
        
        // 여기에서 claimsSet 확인이 가능하다. (time 이 지났는지 확인 가능)

        return claimsSet.get("Email"); // 아까 넣었던 Email 이 그대로 들어있다.
    } catch (ParseException | JOSEException e) {
        logger.log(Level.WARNING, "JWT verification failed: ", e);
        return null;
    }

이렇게 하면 아주 쉽게 DB 를 갔다오지 않고 auth 를 확인 할 수 있게 된다!

This post is licensed under CC BY 4.0 by the author.

© 병욱. Some rights reserved.