Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: 로그아웃 구현 #57

Merged
merged 4 commits into from
Jul 9, 2022

Conversation

kang-jisu
Copy link
Contributor

이슈

작업 내용

  • 로그인관련 메서드 (로그인/회원가입, 리프레시토큰으로 토큰재발급) HTTP method POST로 변경
  • 로그아웃 구현
    • refreshToken 테이블에 userId에 해당하는 refreshToken 삭제, 예외처리
    • httpOnly cookie에 key가 "refreshToken"인 쿠키 유효시간 0, 토큰값 null넣어 초기화
    • 헤더에 refreshToken이름을 가진 쿠키가 없거나 이미 로그아웃 처리 된 쿠키일 경우 예외처리
      • 다시 로그아웃 API 요청한 경우 이미 로그아웃 되었다는 메시지 보냄 (실패는 아니니깐 HTTP status 는 200)
      • 나머지 요청은 에러처리 인터셉터에서 throw new 하는게 잘 안돼서 response.sendError로 처리함

기타 사항

  • 앞으로 컨트롤러 테스트코드에 header에는 jwt token, cookie에는 TestConfig.COOKIE_TOKEN 추가해주어야 요청 성공함
  • 나중에 중복로그인 처리는 따로 고민해야함. 지금은 1아이디 1로그인만 가능해질듯

체크리스트

  • 테스트 성공

@kang-jisu kang-jisu added 💡feature API feature 👥회원관리 회원/로그인 labels Jul 8, 2022
@kang-jisu kang-jisu added this to the 4차 스프린트 milestone Jul 8, 2022
@kang-jisu kang-jisu requested a review from suubinkim July 8, 2022 12:12
@kang-jisu kang-jisu self-assigned this Jul 8, 2022
@kang-jisu kang-jisu added this to To do in BeTree via automation Jul 8, 2022
.sameSite("None")
.httpOnly(true)
.build();
response.setHeader(SET_COOKIE_HEADER, cookie.toString());
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기 쿠키 부분이 어떤 내용인지 이해가 잘 안갑니당..

@suubinkim
Copy link
Member

제가 지금 쿠키 관련해서 전체적으로 이해가 잘 안되는데,, 제가 참고할 만한 자료가 있을까용..

@kang-jisu
Copy link
Contributor Author

제가 지금 쿠키 관련해서 전체적으로 이해가 잘 안되는데,, 제가 참고할 만한 자료가 있을까용..

링크 참고해보시면 좋을 거 같구요

refreshToken은 프론트에서 accessToken보다 긴 기간(일주일)을 가지고 있는 토큰이라, 탈취되면 보안상 위험해서 자바스크립트 코드나 관리자모드로 열어볼 수 없게 헤더에 대놓고 저장하거나 응답값으로 주는게 아니라 http통신할때만 서로 주고받을 수 있도록 httpOnly설정을 한 cookie에 저장해두고요! 로그인했을 때 제가 setCookie, httpOnly(true)로 refreshToken값을 넣어줬는데 로그아웃하면 refreshToken이 이제 쓸모가 없으니까 쿠키에 들어있는 refreshToken 정보를 무효처리 해줬어요!

둘다 해줘야하는건지는 모르겠는데 쿠키 "refreshToken" key값에 그냥 null을 넣어주고, 쿠키가 지속되는 시간 (maxAge)를 0으로 설정해서 그 시간이 지나면 쿠키 사라지게 했구요.!

그리고 어쨌든 저희 api를 통해서 로그인했으면 백엔드쪽에서 쿠키에 refreshToken값을 넣어준 상태일거라고 생각해서 tokenInterceptor에

    private boolean isInvalidRefreshToken(Cookie[] cookies) {
        if (Objects.isNull(cookies)) {
            return true;
        }
        Cookie refreshToken = Arrays.stream(cookies)
                .filter(cookie -> cookie.getName().equals("refreshToken"))
                .findAny()
                .get();
        return Objects.isNull(refreshToken) || Objects.isNull(refreshToken.getValue()) || refreshToken.getValue().equals("") || refreshToken.getValue().isEmpty() || refreshToken.getMaxAge() == ZERO;
    }

헤더에 쿠키가 존재하는지, 그 쿠키의 값이 null이 아니고 어떤 token값인지, maxAge가 0이 아닌지(만료되지 않았는지) 뭐 이런거 체크하는 과정 넣어줘서 컨트롤러테스트부분에 쿠키 하나씩 다 설정해준거예요 !!

@suubinkim
Copy link
Member

핫 이해했습니다..! 로그인때부터 구현되있었던 내용인데 제가 꼼꼼하게 못 봤었네요 ㅠㅠ 죄송해요
고생하셨습니다 !!!!!! 저는 코멘트 달 게 없네용..

@kang-jisu
Copy link
Contributor Author

헉 아니에요!! 로그인부분은 저도 모르는거 그냥 구현해보고있는거라 저도 확신이 별로 없긴해요 ㅋㅋㅋ ㅠㅠ
일단은 배포해서 영광님 로그인로그아웃쪽 구현하시면 에러나는거 찾아보고 나중에 테스트코드에 헤더에 값 추가하는거로 너무 복잡해지는거 같이 코드 리팩토링 해보고 그러면 좋을거같아요 ㅎ_ㅎ
그럼 머지해보겠습니다!! 👍

@kang-jisu kang-jisu merged commit 42a3ca8 into YAPP-Github:develop Jul 9, 2022
BeTree automation moved this from To do to Done Jul 9, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
👥회원관리 회원/로그인 💡feature API feature
Projects
Development

Successfully merging this pull request may close these issues.

None yet

2 participants