JWT -> 구조가 있다 HEADER/PAYLOAD / SUGNATURE 세가지 부분으로 나뉘었다
지금은 PATLOAD 정도만 알면된다.
JWT -> 특정 정보를 담아서 암호화한 토큰, 저장하지 않아도 토큰을 주고받아 인증 가능
인증 흐름
1. 로그인 시 사용자 정보를 검증하여 JWT 생성
2. JWT를 응답에 담아 클라이언트에 전달 (보통Cookie 또는 Header)
3 클라이언트는 요청 시 JWT를 전송하고 서버는 토큰을 검증하여 인증 처리
Cookie에 JWT 저장하는 이유
LocalStorage는 XSS 공격에 취약하며 클라이언트의 JavaScript로 접근 할 수 있음 반면 HttpOnly옵션이 설정된 쿠키는 JavaScript로 접근 할수 없기 때문에 XSS에 강함, 다만 CSRF 공격에 대한 대비가 필요
Cookie 권장 설정
HttpOnly : true
Secure : true (HTTPS 환경에서만 가능)
SameSite : Strict 또는 Lax
만료 시간 설정 필요 (Access vs Refresh Token 전략에 따라 다르게 적용)
Session과 JWT가 다른점 흐름은 비슷하나 JWT는 직접 생성해줘야함..
public String createToken(Long userId, String email, UserRole userRole) {
Date now = new Date();
return "Bearer"()
/*암호화 하고 싶은 부분
.setSubject(String.valueOf(userId)) // 대주제
.claim("email", email)
.claim("userRole", userRole)
*/
/* 토큰을 만들때 시간을 지정한는 부분
.setIssuedAt(now)
.setExpiration (new Date(now.getTime() + TOKEN_TIME))
*/
/* 암호화 해주는 부분
.signWith(key, SignatureAlgorithm.HS256)
.compact
*/
JWT는 인증 정보를 자체적으로 담고 있으며 서버가 상태를 유지할 필요가 없습니다.
Access Token은 인증 요청 시 사용되며 비교적 짧은 만료 시간을 갖습니다.
Refresh Token은 토큰 재발급에 사용되며 긴 만료 시간을 가집니다.
쿠키에 저장할 경우 HttpOnly와 Secure 옵션 설정을 통해 보안을 강화할 수 있습니다.