본문 바로가기

공부/Spring

스프링 부트 3 백엔드 개발자 되기_20

9.3 토큰 API구현하기

리프레시 토큰을 전달받아 검증하고 유효한 리프레시 토큰이라면 새로운 액세스 토큰을 생성하는 토큰 API를 구현합니다.


@DisplayName("createNewAccessToken: 새로운 액세스 토큰을 발급한다.")
    @Test
    public void createNewAccessToken() throws Exception{
        //given 테스트 유저를 생성하고 jjwt라이브러리를 이용해 리프레시 토큰을 만들어 데이터베이스에 저장
        //토큰생성 API의 요청 본문에 리프레시 토큰을 포함하여 요청 객체를 생성
        final String url = "/api/token";

        User testUser = userRepository.save(User.builder()
                .email("user@gmail.com")
                .password("test")
                .build());

        String refreshToken = JwtFactory.builder()
                .claims(Map.of("id", testUser.getId()))
                .build()
                .createToken(jwtProperties);

        refreshTokenRepository.save(new RefreshToken(testUser.getId(),refreshToken));

        CreateAccessTokenRequest request = new CreateAccessTokenRequest();
        request.setRefreshToken(refreshToken);
        final String requestBody = objectMapper.writeValueAsString(request);

        //when 토큰 추가 API에 요청을 보냄 , 이때 요청 타입은 JSON이며 given절에서 미리 만들어둔 객체를 요청 본문으로 함께 보냄
        ResultActions resultActions = mockMvc.perform(post(url)
                .contentType(MediaType.APPLICATION_JSON_VALUE)
                .content(requestBody));

        //then 응답코드가 201 Created인지 확인후 응답으로 온 액세스 토큰이 비어있지 않은지 확인
        resultActions
                .andExpect(status().isCreated())
                .andExpect(jsonPath("$.accessToken").isNotEmpty());
    }


#9장 요약
1.토큰은 클라이언트를 구분하는 데 사용하는 유일한 값으로 서버에서 생성하여 클라이언트에게 제공후 클라이언트는 서버에 요청할 때마다 요청 내용과 함께 토큰을 전송
서버에서는 토큰으로 유효한 사용자인지 검증

2.JWT는 토큰 기반 인증에서 주로 사용하는 토큰
JSON 형식으로 사용자(클라이언트)의 정보를 저장
JWT는 헤더,내용,서명 구조로 이루어져 있다 헤더는 토큰의 타입과 해싱 알고리즘을 지정하는 정보를 포함
정보에는 토큰에 담을 정보가 들어감
해당 토큰이 조작됐거나 변경되지 않았음을 확인하는 용도로 서명을 사용
리프레시 토큰은 액세스 토큰과 별개의 토큰, 액세스 토큰이 만료되었을 때 새로운 액세스 토큰을 발급받는 용도로 사용
필터는 실제로 요청이 전달되기 전과 후에 URL 패턴에 맞는 모든 요청을 처리하는 기능을 제공
시큐리티 콘텍스트는 인증 객체가 저장되는 보관소로 인증 정보가 필요할 때 언제든지 인증 객체를 꺼내어 사용하도록 제공되는 클래스다
이런 시큐리티 컨텍스트 객체를 저장하는 객체가 시큐리티 컨텍스트 홀더