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

[FEATURE] : JWT 토큰 생성 및 검증 #61

Open
wants to merge 18 commits into
base: develop
Choose a base branch
from

Conversation

isyoudwn
Copy link

@isyoudwn isyoudwn commented Oct 13, 2024

🆕 기능 추가 / 🔧 버그 수정

  • 기능 추가:
  • JWT 토큰 refresh token과 access token 생성 및 검증 기능 추가
  • ClockConfig 추가

📋 변경 사항

  • JwtProvider : 토큰을 생성 및 검증
  • JwtUtil : Jwt관련 util 성질을 가지고 있는 메소드를 모은 클래스
  • JwtProperties : jwt 설정파일에 접근
  • JwtResponse : access token과 refresh token을 반환
  • User 도메인에 UserRole 클래스 추가
  • ClockConfig : 애플리케이션의 타임존을 서울로 설정합니다
  • TimeUtil : 시간타입 메서드를 관리합니다.

🔍 테스트 사항

  • JwtProvider 테스트
  • TimeUtil 테스트

📝 추가 사항

  • 토큰 발급 테스트에서 시간대를 고정하는데 어려움이 있어서 도움요청드립니다.

- common에 JwtProvider 추가: Jwt 토큰의 로직을 담당하기 위함
- common에 JwtProvider 추가: yml 파일에 있는 jwt 구성요소에 접근하기 위함
createAccessToken 메소드를 통해 발급된 토큰이 null이 아닌지 확인합니다.
- 파라미터를 이용하여 단순한 토큰 인코딩을 제공하는 메소드를 JwtUtil에 분리
- 토큰의 유효성을 검사하는 verifyToken 메소드 구현
>>
>> - verifyToken_valid 메소드로 토큰의 유효성을 검사
>> - verifyToken_expired 메소드로 만료된 토큰에 대해 예외를 발생시키는지 검사
- getClaims : 토큰에서 추출한 정보를 반환하는 메소드
- getClaims 메소드가 디코딩한 내용과, 디코딩 전 내용이 동일한지 테스트
- 반복되는 코드 메소드화
- 값들을 상수화
- createRefreshToken 메소드: claim을 가지고 있지 않은 리프레시 토큰 생성
- 리프레시 토큰이 발급 되는지 확인
- 상수명 대문자 및 카멜스타일로 변경
- stubExpiration -> stubAccessTokenExpiration 메소드명을 명확하게 변경
- generateToken : refreshToken과 accessToken을 같이 반환
- DTO 추가
- 발급된 refreshToken이 null이 아님을 확인
- 발급된 accessToken이 null이 아님을 확인
- User 도메인에 userRole enum 클래스 추가
- createAccessToken : userRole 파라미터 추가
- generateToken : userRole 파라미터 추가
- test 코드에 userRole 반영으로 인한 변경사항 추가
@isyoudwn isyoudwn added this to the 인증 도메인 milestone Oct 13, 2024
@isyoudwn isyoudwn requested review from world-dv, na0th and KNU-K October 13, 2024 05:46
@isyoudwn isyoudwn self-assigned this Oct 13, 2024
@isyoudwn isyoudwn requested a review from wonjjang44 October 13, 2024 05:46
* */
public String createAccessToken(Long userId, String userRole) {

Date now = new Date(System.currentTimeMillis());
Copy link
Member

Choose a reason for hiding this comment

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

Date TZ 고정화 부분 수정 필요할거 같아요~ 아까 말한느낌으로 해당 PR 브랜치에 push 해주세요

Copy link
Author

Choose a reason for hiding this comment

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

안녕하세요 태현님! 해당 사항 수정해서 PR 브랜치에 push 했습니다 :)
하지만, 수정하면서 아래의 이슈가 있었습니다! 같이 이야기 나누어보면 좋을 것 같습니다.

  1. jjwt라이브러리는 Date만을 지원합니다.
    다른 타입 지원은 아직 개발 중이라고 합니다.

  2. 따라서 TimeUtil 클래스를 만들어서 시간대를 localDateTime -> Date로 변환하는 방법으로 수정하였습니다.

  3. 하지만 Date로 변환 과정에서 region이나 운영체제에 영향을 받을 수 있습니다.

  • 그러나, 발급해주는 시간 자체를 한국으로 고정해서 발급했기 때문에 언제든 다시 한국 시간을 유추할 수 있어서 해당 방법을 사용했습니다.
  • 또한, jjwt 라이브러리에서 토큰을 검증할 때도 UTC 시간을 기준으로 비교 하기 때문에, 발급해주는 애플리케이션의 시간대만 고정되어있으면 괜찮을 것 같아서 먼저, 해당 방법을 선택해서 작업 했습니다.

@CreatorDodo
Copy link

👏👏👏

jjwt 라이브러리가 Date 타입만 지원을 한다고 합니다. 그 스펙에 맞춰서 수정하였습니다.
- ClockConfig(Class) : ClockConfig를 통해 애플리케이션의 타임존을 Asia/Seoul로 고정합니다
- TimeUtil(Class) : localDateTime -> Date로 변환하는 메서드를 포함합니다. 반대의 경우도 추가 예정입니다.
- JwtProvider(Class) :
1. clock을 주입받습니다.
2. 토큰이 생성될 경우 clock을 이용하여 시간을 가져오고 그 시간을 다시 Date로 변환하여 jwt의 claim에 설정합니다.
@isyoudwn isyoudwn changed the title [FEATURE] : [JWT 토큰 생성 및 검증] [FEATURE] : JWT 토큰 생성 및 검증 Oct 24, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: No status
Development

Successfully merging this pull request may close these issues.

3 participants