-
spring boot 에서 JWT 사용하기.Computer Science/Spring boot 2022. 9. 4. 18:43
JWT란
Json Web Token의 약자로 token방식의 인증을 할 때 사용한다.
Jwt를 사용하는 이유로는
1. Token을 client에서 저장하기 때문에 서버에서 관리할 필요가 없어 서버의 확장성에 용이하다.
2. 무결성이 장점으로 토큰을 HMAC(Hash-based Message Authentication) 기법으로 발급하기에 토큰의 정보를 변경하는 행위가 불가능하다. 하여 보안적인 측면에서 client가 변조된 값으로 server에 접근하기 어렵다.
JWT는 크게 3가지로 구성이 되어있는데
aaaa.bbbb.cccc
(header).(payload).(signature)
로 구성되어있다.
header
Token의 타입과 Hash알고리즘을 지정하는 정보를 가지고 있다.
{"typ":"JWT","alg":"HS256"}typ는 Token의 타입을 지정한다. JWT 이니 JWT로 입력해준다.
alg는 hash 알고리즘 이다. HS256알고리즘을 사용한다고 입력해준다.
payload
Token에 담을 정보가 입력된다. 정보는 Json형태이므로 key-value로 저장되는데 크게 3가지 종류가 있다.
Register Claim - JWT에 사용되는 기본 key들의 집합이다.
Public Claim - 공개된 것으로 Key가 중복되지 않게 대부분 URI로 claim이름을 짓는다.
private Claim - server와 client간의 임의로 지정한 정보를 주고받는 claim이다.
Register Claim에는 다음과 같은 종류가 있다.
"iss" : Token 발급자
"sub" : Token 제목
"aud" : Token 대상자
"exp" : Token의 만료시간. 시간은 NumericDate형식으로 구성되어야 한다.
"nbf" : Token의 활성 날짜. 사용가능한 시작 날짜이다. 마찬가지로 NumericDate형식이다.
"iat" : Token이 발급된 시간.
"jti" : JWT의 고유 식별자로 일회용 토큰에 사용된다.
Signature
해당 Token의 조작 여부를 확인하는 용도로 사용되며, header의 인코딩 값과 payload의 인코딩 값을 합친 후에 server의 secret key를 사용해 hash값을 생성한다.
ex) HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret_key)
https://www.ibm.com/docs/vi/sva/9.0.6?topic=jwt-support
문서에 가보면 HS256의 secret key는 256bit로 하는 것을 추천하고 있다.
openssl rand -hex 64
를 입력하면 random으로 만들어준다.
Spring boot 에서 JWT 생성하기.
우선 jsonwebtoken을 implement 해준다.
//JWT implementation 'io.jsonwebtoken:jjwt:0.9.1'
json token 생성 함수이다.
public String makeJwtTokenById(Long id) { Date now = new Date(); return Jwts.builder() .setHeaderParam(Header.TYPE, Header.JWT_TYPE) // header type (jwt) .setIssuer("lof-server") // (iss setting) .setIssuedAt(now) // (iat setting) .setExpiration(new Date(now.getTime() + Duration.ofMinutes(30).toMillis())) // (exp setting) .claim("id", id) // (secret claim setting) .signWith(SignatureAlgorithm.HS256, "secret") // (signature setting) .compact(); }
parse 함수 이다.
결과는 json으로 나오게 된다.
public Claims parseJwtToken(String token){ return Jwts.parser() .setSigningKey("secret") .parseClaimsJws(token) .getBody(); }
'Computer Science > Spring boot' 카테고리의 다른 글
Spring boot 와 Spring의 차이 (2) 2022.10.05 Spring boot 비동기 처리 (Aysnc) (0) 2022.09.29 spring boot datadog json으로 log 남기기. (0) 2022.08.05 Cerbot을 통한 SSL 발급받아 Spring boot에 적용하기 (0) 2022.07.27 Spring boot에 APM(dataDog) 적용하기. (0) 2022.07.26