항해99

23.09.16 항해 99 16기 주특기 프로젝트 2일차

김용글 2023. 9. 16. 22:49

오늘 공부한 것

* 주특기 프로젝트 로그인 페이지 구현

* 주특기 프로젝트 마이페이지 조회 구현

* Refresh Token 특강

 

  • 회원가입/로그인
    • [ ] 회원가입 기능  완료
    • [ ] 로그인 기능
    • [ ] JWT filter / 토큰 쿠키로 전달.
  • MY PAGE
    • [ ] 마이페이지 조회

 

로그인 페이지를 구현할때 Filter를 사용해보기로해서 만들었는데

Filter 사용 이후 회원가입과 로그인 모두 " 토큰을 찾을 수 없습니다 " 라는 예외가 나오기시작했다.

기능적인 문제 인가 코드를 살펴보았지만  아무리봐도 문제가없어보여서 오타를 몇개 찾아내서 수정했지만

소용이 없었다.. 결국 페어분께 함께 봐달라고 부탁드렸고 바로 찾을 수 있었다

 

아래 코드에서  이 부분이었던 것을

(url.startsWith("/api/user") || url.startsWith("/css") || url.startsWith("/js"))

이렇게 바꾸니까 되었다 결국 Url 이 controller 와 일치하지 않아서 생기는 문제였다

매번 위의 Url 로 하다가 버릇처럼 그대로 입력했던 것이다 이런 실수는 하지 않도록해야겠다

(url.startsWith("/api/signup") || url.startsWith("/api/login") || url.startsWith("/css") || url.startsWith("/js"))
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest httpServletRequest = (HttpServletRequest) request;
    String url = httpServletRequest.getRequestURI();

    if (StringUtils.hasText(url) &&
            (url.startsWith("/api/signup") || url.startsWith("/api/login") || url.startsWith("/css") || url.startsWith("/js"))
    ) {
        // 회원가입, 로그인 관련 API 는 인증 필요없이 요청 진행
        chain.doFilter(request, response); // 다음 Filter 로 이동
    } else {
        // 나머지 API 요청은 인증 처리 진행
        // 토큰 확인
        String tokenValue = jwtUtil.getTokenFromRequest(httpServletRequest);

        if (StringUtils.hasText(tokenValue)) { // 토큰이 존재하면 검증 시작
            // JWT 토큰 substring
            String token = jwtUtil.substringToken(tokenValue);

            // 토큰 검증
            if (!jwtUtil.validateToken(token)) {
                throw new IllegalArgumentException("토큰 에러");
            }

            // 토큰에서 사용자 정보 가져오기
            Claims info = jwtUtil.getUserInfoFromToken(token);

            Member member = memberRepository.findByEmail(info.getSubject()).orElseThrow(() ->
                    new NullPointerException("이메일을 찾을 수 없습니다")
            );

            request.setAttribute("member", member);
            chain.doFilter(request, response); // 다음 Filter 로 이동
        } else {
            throw new IllegalArgumentException("토큰을 찾을 수 없습니다");
        }
    }
}

 

이후에는 마이페이지 조회 기능을 구현했다 

사실 이건 구현하고 어떻게 테스트를 해야할지 몰라서 나중에 프론트와 합친 후 확인 하기로 했다

 

저녁에는 Refresh Token 에 대한 특강이 있었다

간단한 정의와 예제코드를 보면서 특강이 이어졌다

나중에 코드도 주신다고했으니 받으면 잘 복습해봐야겠다

 

Refresh Token Access Token의 유효기간을 짧고, 자주 재발급 하도록 만들어 보안을 강화하면서 사용자에게 잦은

                         로그아웃 경험을 주지 않도록하는 것

                         Access Token 은 리스소에 접근하기 위해 사용되는 토큰이라면 Refresh Token은 기존에 클라이언트가

                        가지고 있던 Access Token 이 만료되었을 때 새로 발급받기위해 사용함