1. 사용자 로그인 요청
- 사용자가 로그인 페이지에서 사용자명(username)과 비밀번호(password)를 입력하고 서버에 로그인 요청을 보냅니다.
2. 서버에서 자격 증명 확인
- 서버는 데이터베이스에서 해당 사용자명을 검색하고, 비밀번호를 확인합니다.
- 자격 증명이 올바르다면, 서버는 JWT를 생성합니다.
3. JWT 토큰 생성
- 서버는 사용자의 ID, 역할 등의 정보를 담은 JWT를 생성하고, 이 토큰을 서명합니다.
- 예를 들어, Payload에는 사용자 ID(sub), 발행 시간(iat), 만료 시간(exp) 등이 포함됩니다.
- 서명(Signature)은 서버의 비밀키로 이루어지며, 이를 통해 토큰의 무결성을 보장합니다.
4. JWT 토큰 클라이언트로 전송
- 생성된 JWT는 클라이언트에게 응답으로 전송됩니다.
- 클라이언트는 이 JWT를 브라우저의 로컬 스토리지나 쿠키에 저장합니다.
5. 인증된 요청
- 클라이언트는 이후 서버로 요청을 보낼 때, 이 JWT를 HTTP 헤더에 포함시켜(Authorization: Bearer <JWT>) 서버에 전달합니다.
6. 서버에서 JWT 검증
- 서버는 클라이언트로부터 받은 JWT를 검증합니다.
- 서명(Signature)을 확인하여 토큰이 변조되지 않았는지 확인하고, 토큰의 만료 시간도 체크합니다.
- 검증이 성공하면, 토큰에 포함된 정보를 사용해 사용자를 인증하고, 요청을 처리합니다.
7. 응답 처리
- 서버는 인증된 사용자의 요청을 처리한 후, 결과를 클라이언트에게 응답합니다.
8. 토큰 만료 및 갱신
- JWT는 만료 시간이 있기 때문에, 만료된 후에는 클라이언트가 다시 로그인을 시도하거나, 리프레시 토큰을 이용해 새로운 JWT를 발급받을 수 있습니다.
요약
JWT는 로그인 시 서버에서 발급된 후, 클라이언트와 서버 간에 인증을 유지하기 위해 사용됩니다. 클라이언트는 JWT를 저장하고, 서버에 요청할 때마다 이를 전송하여 인증을 수행합니다. 서버는 JWT의 서명을 검증하여 요청을 처리합니다.
------------------------샘플코드-----------------------
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import javax.xml.bind.DatatypeConverter;
import java.util.Date;
public class JwtExample {
// 비밀 키 (예제용으로 간단하게 Base64로 인코딩된 문자열을 사용)
private static final String SECRET_KEY = "mySecretKey12345";
public static void main(String[] args) {
// 1. JWT 토큰 생성
String jwt = Jwts.builder()
.setSubject("user123") // 사용자 정보 (Subject)
.setIssuedAt(new Date()) // 발행 시간
.setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 만료 시간 (1시간)
.signWith(SignatureAlgorithm.HS256, DatatypeConverter.parseBase64Binary(SECRET_KEY)) // 서명
.compact(); // 토큰 생성
System.out.println("Generated JWT: " + jwt);
// 2. JWT 토큰 검증
try {
Claims claims = Jwts.parser()
.setSigningKey(DatatypeConverter.parseBase64Binary(SECRET_KEY)) // 검증을 위한 서명 키
.parseClaimsJws(jwt) // 토큰 파싱 및 검증
.getBody(); // 클레임 추출
System.out.println("Verified Subject: " + claims.getSubject());
} catch (Exception e) {
System.out.println("Invalid JWT token: " + e.getMessage());
}
}
}
'자바' 카테고리의 다른 글
list.size()==0 ▶▶▶ list.isEmpty() (0) | 2023.11.07 |
---|---|
배열을 리스트로 (0) | 2022.12.21 |
SimpleDateFormat (0) | 2022.09.16 |
Calendar, Date (0) | 2021.05.23 |
Wrapper 클래스 (0) | 2021.05.23 |