JWT Token으로 사용자 인증하기: Spring에서 간편하게 적용하는 방법
JWT 가 뭘까??
JWT 는 json web token
의 약자로 통신 할 때 인증 할 때 주로 사용하는 토큰이다! 그 특정 토큰을 사용하면 내가 그 사용자라는 것이 인증되는 것이다. 그 토큰은 아래 처럼 사용 될 수 있다.
- Client 가 서버에 로그인을 요청한다
- 서버는 DB 를 확인하여 user 가 맞는지 확인한다.
- 서버는 JWT 을 발급한다
- Client 는 Cookie 에 JWT 를 담아두고 서버에 요청시 Token 과 함께 가도록 한다.
- 서버는 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.