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: JWT Authentication 로직 개선 및 예외처리 보완 #18

Merged
merged 3 commits into from
Aug 5, 2023

Conversation

versatile0010
Copy link
Member

@versatile0010 versatile0010 commented Aug 4, 2023

변경사항


JWT Authtentication Filter

[ TokenAuthenticaionFilter ]

  1. token 검증이 필요하지 않는 path (e.g. /auth/login ) 에 대해서는 token 유효성을 검사하지 않고 넘어간다.
  2. access token 이 유효하면 (유효하지 않으면 InvalidTokenException)
    • 인증 정보를 저장한다. (끝)
  3. access token 이 유효하지만 만료되었다면

3.1 jwt에서 userId 를 꺼낸다.
3.2 해당 userId 에 대한 refresh token 이 유효하면 access token 을 재발급하고 Authorization header 에 담아서 반환한다.
3.3 해당 userId 에 대한 refresh token 이 존재하지 않으면 JwtNoTokenException
3.4 해당 userId 에 대한 refresh token 이 존재하지만 만료되었다면 JwtExpiredTokenException

  • AuthenticaionFitler 을 수행하다가 Exception 이 발생하면, JwtExceptionFilter 에서 이를 catch 해서 http response 작업을 수행해서 에러 로그 세분화.

[특징]

  • refresh token 은 클라이언트에게 전달하지 않음으로써 보안성 증가
  • access token 이 만료된 경우. 유효하고 만료되지 않은 refresh token 이 db 에 있다면 서버에서 알아서 access token 을 발급
  • token reissue api 를 별도로 구현하지 않아도 됨.

[프론트에서는]

  • 7 일에 1번씩 refresh token 이 만료될텐데 client 쪽에서 JWT 에러를 캐치하면, /auth/login 으로 리다이렉트하도록 구현하면 서버에서 알아서 refresh , access token 발급되도록 구성함.
  • " 401 에러 등 발생하면 /auth/login 으로 redirect "

case i) DB 에 없는 신규 회원 로그인 요청
request

{
  "email": "DB에없는이메일@naver.com",
  "name": "DB에없는이름"
}

response

{
  "code": 1000,
  "status": 200,
  "message": "요청에 성공하였습니다.",
  "result": {
    "accessToken": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJEQuyXkOyXhuuKlOydtOuplOydvEBuYXZlci5jb20iLCJhdXRoIjoiUk9MRV9NRU1CRVIsUk9MRV9BRE1JTiIsInVzZXJJZCI6IjUiLCJpYXQiOjE2OTExNjEzMDAsImV4cCI6MTY5MTE2MzEwMH0.LPCm8DW0rbemkFADCZdQpkn2oEy8akmb6BG1jp164MM",
    "tokenType": "JWT Bearer ",
    "memberId": 5,
    "grade": "ROLE_MEMBER"
  }
}

case ii) 기존 회원 로그인 요청
request

{
    "name": "김회원",
    "email": "member1@example.com"
}

response

{
    "code": 1000,
    "status": 200,
    "message": "요청에 성공하였습니다.",
    "result": {
        "accessToken": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJtZW1iZXIxQGV4YW1wbGUuY29tIiwiYXV0aCI6IlJPTEVfTUVNQkVSLFJPTEVfQURNSU4iLCJ1c2VySWQiOiIxIiwiaWF0IjoxNjkxMTYxNDc4LCJleHAiOjE2OTExNjMyNzh9.LDgooJR-g0t54ggWuJUSrIWEsDeuQ4Lg-2GX-Su7HFw",
        "tokenType": "JWT Bearer ",
        "memberId": 1,
        "grade": "ROLE_MEMBER"
    }
}

case iii) 만료된 토큰으로 Member API 요청하였지만 refresh token 이 존재하는 경우

  • access token 을 재발급하고, 기존에 요청했던 API 를 동작시킴

문제를 발견하시면,,,
바로 알려주시면 금방 고칠게요!

- "/auth", "/brand", "/users" 에 대해서는 토큰 검증
- "/auth/login" 에 대해서는 토큰 검증 x
@akfrdma0125
Copy link
Collaborator

코드 확인했습니다!!

@akfrdma0125 akfrdma0125 merged commit 08e30e0 into main Aug 5, 2023
2 checks passed
@versatile0010 versatile0010 deleted the feature/jwtFilter branch August 5, 2023 07:26
limsubinn pushed a commit that referenced this pull request Aug 5, 2023
feat: JWT Authentication 로직 개선 및 예외처리 보완
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants