JWT 도입 3편 - Refresh Token 발급

민선규·2024년 7월 17일
0

JAVA

목록 보기
21/25
post-thumbnail

JWT

저번 시간까지 Access Token 발급, 인증 처리를 구현하였습니다. 이번에는 Refresh Token 발급에 대해 구현을 하고 테스트를 진행해보겠습니다.

Refresh Token이 도입된 배경은 다음과 같습니다.

Access Token을 짧은 유효 기간으로 설정하면 보안을 강화 할 수 있습니다. 만약 Access Token이 노출되더라도 짧은 시간 내에 만료되기 때문입니다. 하지만 짧은 유효 기간으로 Access Token이 만료되었을 때 계속해서 서비스를 이용할 수 있도록 하기 위해 Refresh Token을 사용합니다.

AuthService

기존 AuthService의 login() 함수에서는 Access Token만 발급을 하고 있었는데 여기서 Refresh Token 발급까지 구현을 하면 됩니다. 다만 차이점은 Refresh Token의 경우에는 쿠키에 저장하여 반환하고 있는데 이유는 다음과 같습니다.

  1. 쿠키에 저장하기 때문에 추가적인 보안을 설정할 수 있습니다.
  2. 쿠키를 사용하면 브라우저가 자동으로 토큰을 포함하여 서버에 요청을 보낼 수 있어, 클라이언트 측에서 직접 토큰을 관리할 필요가 없습니다.
@Service
@RequiredArgsConstructor
public class AuthService {

    private final JwtUtil jwtUtil;
    private final MemberService memberService;
    @Value("${spring.jwt.accessToken_expiration_time}")
    private Long accessTokenExpiredMs;
    @Value("${spring.jwt.refreshToken_expiration_time}")
    private Long refreshTokenExpiredMs;
    
    public AuthResponseDto login(AuthRequestDto authRequestDto) {
    	//authRequestDto가 가지고 있는 uuid를 조건으로 MemberResponseDto를 가져옵니다.
        MemberResponseDto memberResponseDto = memberService.findByUuid(authRequestDto.getUuid());
		
        //MemberResponseDto 값이 null이면 회원가입을 실행합니다.
        if(memberResponseDto == null){
            memberResponseDto = memberService.save(authRequestDto.getUuid(), authRequestDto.getNickname());
        }

		//MemberResponseDto를 기반으로 Access Token을 만듭니다.
        String accessToken = jwtUtil.createJwt("access", memberResponseDto, accessTokenExpiredMs);
        //MemberResponseDto를 기반으로 Refresh Token을 만듭니다.
        String refreshToken = jwtUtil.createJwt("refresh", memberResponseDto, refreshTokenExpiredMs);

		//createCookie() 함수를 호출하여 쿠키를 생성하고 저장합니다.
        response.addCookie(createCookie("refresh", refreshToken));

		//AuthResponseDto에 Access Token 값을 넣어서 생성합니다.
        AuthResponseDto authResponseDto = AuthResponseDto.builder()
                .accessToken(accessToken)
                .build();

		//AuthResponseDto을 반환합니다.
        return authResponseDto;
    }
}

	//쿠키를 생성하는 함수입니다.
    private Cookie createCookie(String key, String value){
        Cookie cookie = new Cookie(key, value);
        cookie.setMaxAge(24 * 60 * 60);
        //하위 내용은 보안에 관련된 내용입니다.
        //cookie.setHttpOnly(true);
        //cookie.setAttribute("SameSite", "None");
        //cookie.setPath("/");
        //cookie.setSecure(true);
        return cookie;
    }

TEST

Refresh Token 발급 구현은 간단하게 마무리하였습니다. 이제 포스트맨으로 쿠키로 Refresh Token이 잘 넘어오는지 테스트해보겠습니다.

테스트를 해본 결과 쿠키에 Refresh Token이 잘 넘어오는 것을 확인할 수 있었습니다. 다음 포스트에서는 발급된 Refresh Token으로 Access Token을 재발급하는 로직을 작성해보겠습니다!

0개의 댓글

관련 채용 정보