로그인 성공 시 다중 토큰 발급과 발급 위치
로그인이 성공하면 기존에 단일 토큰만 발급해지만 Access/Refresh 에 해당하는 다중 토큰을 발급해야 한다.
따라서 로그인이 성공한 이후 실행되는 successfulAuthentication() 메소드 또는 AuthenticationSuccessHandler를 구현한 클래스에서 2개의 토큰을 발급한다.
각각의 토큰은 생명주기와 사용처가 다르기 때문에 심화 2에서와 같이 서로 다른 저장소에 발급한다.
- Access : 헤더에 발급 후 프론트에서 로컬 스토리지 저장
- Refresh : 쿠키에 발급
로그인 성공 핸들러
- 성공 루틴
@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authentication) {
//유저 정보
String username = authentication.getName();
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
Iterator<? extends GrantedAuthority> iterator = authorities.iterator();
GrantedAuthority auth = iterator.next();
String role = auth.getAuthority();
//토큰 생성
String access = jwtUtil.createJwt("access", username, role, 600000L);
String refresh = jwtUtil.createJwt("refresh", username, role, 86400000L);
//응답 설정
response.setHeader("access", access);
response.addCookie(createCookie("refresh", refresh));
response.setStatus(HttpStatus.OK.value());
}
- 쿠키 생성 메소드
// 쿠키 생성 메소드
private Cookie createCookie(String key, String value) {
Cookie cookie = new Cookie(key, value);
cookie.setMaxAge(24*60*60);
// HTTP 통신을 진행할 경우
//cookie.setSecure(true);
// 쿠키가 적용될 범위
//cookie.setPath("/");
// JS로 해당 쿠키를 접근하지 못하게
cookie.setHttpOnly(true);
return cookie;
}
JWTUtil
- createJwt() 메소드
public String createJwt(String category, String username, String role, Long expiredMs) {
return Jwts.builder()
.claim("category", category)
.claim("username", username)
.claim("role", role)
.issuedAt(new Date(System.currentTimeMillis()))
.expiration(new Date(System.currentTimeMillis() + expiredMs))
.signWith(secretKey)
.compact();
}
- getCategory 메소드 추가 : 토큰 판단용
public String getCategory(String token) {
return Jwts.parser().verifyWith(secretKey).build().parseSignedClaims(token).getPayload().get("category", String.class);
}
'Spring > Spring Security - JWT' 카테고리의 다른 글
스프링 JWT 심화 6 : Refresh로 Access 토큰 재발급 (0) | 2024.12.22 |
---|---|
스프링 JWT 심화 5 : Access 토큰 필터 : JWTFilter (0) | 2024.12.22 |
스프링 JWT 심화 3 : 기반 프로젝트 (0) | 2024.12.22 |
스프링 JWT 심화 2 : 보안을 위한 JWT 진화 (0) | 2024.12.22 |
스프링 JWT 심화 1 : 실습 목표 (0) | 2024.12.21 |