
👉🏻 이 글은 <스프링부트3 백엔드 개발자 되기-자바편(2판)>의 9장을 공부하며 작성한 글입니다.
JWT (Json Web Token) : 웹 표준을 따르며 JSON 객체를 사용하여 정보를 전달한다. 토큰 기반의 인증 방법을 사용한다.
1. 서버 기반 인증
2. 토큰 기반 인증

책의 내용을 위와 같이 그림으로 정리함.
발급받은 JWT를 이용해 인증을 하려면 HTTP 요청 헤더 중, Authorization 키값에 Bearer + JWT 토큰값 을 넣어 보내야 합니다.
JWT는 .을 기준으로 헤더(header) / 내용(payload) / 서명(signature) 으로 이루어져 있습니다.

TokenProvider.java - makeToken 메서드
// JWT 토큰 생성 메서드
private String makeToken(Date expiry, User user){
Date now = new Date();
// JWT = 헤더.내용.서명
return Jwts.builder()
// 헤더 typ : JWT
.setHeaderParam(Header.TYPE, Header.JWT_TYPE)
// 내용 iss : ajufresh@gmail.com(propertise 파일에서 설정한 값)
.setIssuer(jwtProperties.getIssuer())
.setIssuedAt(now) // 내용 iat : 현재 시간
.setExpiration(expiry) // 내용 exp : expiry 멤버 변숫값
.setSubject(user.getEmail()) // 내용 sub : 유저의 이메일
.claim("id", user.getId()) // 클레임 id : 유저 ID
// 서명 : 비밀값과 함께 해시값을 HS256 방식으로 암호화
.signWith(SignatureAlgorithm.HS256, jwtProperties.getSecretKey())
.compact();
}
❓ 만약 토큰 자체가 노출된다면? 토큰은 이미 발급되면 그 자체로 인증 수단이 되므로 서버는 토큰과 함께 들어온 요청이 토큰을 탈취한 사람의 요청인지 확인할 수 없다.
❗리프레시 토큰
보안을 위해서는 토큰의 유효기간이 짧으면 되겠지만, 토큰의 유효기간이 너무 짧으면 사용자 입장에서는 불편할 수 있다.
➡️ 액세스 토큰의 유효기간을 짧게 하고, 리프레시 토큰의 유효기간을 길게 설정!
리프레시 토큰은 액세스 토큰과 별개로 액세스 토큰이 만료되었을 때 새로운 액세스 토큰을 발급하기 위해 사용한다.

이를 이해하고 JWT 서비스를 구현하면 됨.