JWT 다루기

금은체리·2023년 11월 15일
0

Spring

목록 보기
13/49

JwtUtil 만들기

  • Util 클래스
    • 특정 매개 변수(파라미터)에 대한 작업을 수행하는 메서드들이 존재하는 클래스
    • 다른 객체에 의존하지 않고 하나의 모듈로서 동작하는 클래스
  • <JWT 관련 기능>
    1. JWT 생성
    2. 생성된 JWT를 Cookie에 저장
    3. Cookie에 들어있던 JWT 토큰을 Substring
      • Substring: 특정 구간 문자열 자르기
    4. JWT 검증
    5. JWT에서 사용자 정보 가져오기
  • 토큰 생성에 필요한 데이터
    • Base64로 Encode된 Secret Key를 properties에 작성해두고 @Value를 통해 가져옴
      • @Value("${application.properties에서 선언한 Key 값}")
    • JWT를 생성할 때 가져온 Secret Key로 암호화
      • 이때 Encode된 Secret Key를 Decode해서 사용
      • Key는 Decode된 Secret Key를 담는 객체
      • @PostConstruct는 딱 한 번만 받아오면 되는 값을 사용할 때마다 요청을 새로 호출하는 실수를 방지하기 위해 사용
        • JwtUtil 클래스의 생성자 호출 이후에 실행되어 Key 필드에 값을 주입 해줌
    • 암호화 알고리즘은 HS256 알고리즘 사용
    • Bearer: JWT 혹은 OAuth에 대한 토큰을 사용한다는 표시
      • Bearer 뒤에 띄어쓰기 필수!
    • 로깅: 애플리케이션이 동작하는 동안 프로젝트의 상태나 동작 정보를 시간순으로 기록하는 것

📌 사용자의 권한의 종류를 Enum을 사용해서 관리

  • JWT를 생성할 때 사용자의 정보로 해당 사용자의 권한을 넣어줄 때 사용

1. JWT 생성

  • .setSubject(ID)
    • JWT의 subject에 사용자의 식별값 즉, ID를 넣음
  • .clame(Key, Value)
    • JWT에 사용자의 권한 정보를 넣음
    • key-value 형식으로 key 값을 통해 확인 가능
  • .setExpiration(new Date(date.getTime() + TOKEN_TIME))
    • date.getTime() : 현재 시간
    • 토큰 만료시간을 ms 기준으로 넣음
  • issuedAt에 발급일을 넣음
  • .signWith(만든 Secret Key 값, 암호화 알고리즘)
    • signWith에 secretKey 값을 담고있는 key와 암호화 알고리즘을 값을 넣어줌
      • key와 암호화 알고리즘을 사용하여 JWT 암호화

2. JWT Cookie에 저장

  • Cookie(Name, Value)
    • Value 부분에 URL Encoder로 Encoding 한 Token 값 대입

3. 받아온 Cookie의 Value인 JWT 토큰 Substring

  • Token에 Bearer + 공백 만큼 있으면 오류나기 때문에 Substring해줌
  • StringUtils.hasText
    • 공백, null을 확인
  • startsWith
    • 토큰의 시작값이 Bearer이 맞는지 확인
      • 토큰은 무조건 Bearer로 시작하기 때문
  • .substring(7)
    • bearer + 공백하면 7글자
  • 맞다면 순수 JWT를 반환하기 위해 substring을 사용하여 Bearer을 잘라냄

4. JWT 검증

  • .setSigningKey(암호화 할 때 사용한 Key)
  • .parseClaimsJws(받아온 token)
  • Jwts.parserBuilder()를 사용하여 JWT 파싱 가능
  • JWT가 위변조되지 않았는지 secretKey(key)값을 넣어 확인

5. JWT에서 사용자 정보 가져오기

  • JWT의 구조 중 Payload부분에는 토큰에 담긴 정보가 들어있음
  • 여기에 담긴 정보의 한'조각'을 클레임(claim)이라 부름
    • key-value의 한 쌍으로 이뤄져있음
    • 토큰에는 여러개의 클레임들을 넣을 수 있음
  • Jwts.parserBuilder(분석할 token)와 secretKey를 사용하여 JWT의 Claims를 가져와 담겨 있는 사용자의 정보를 사용

JWT 테스트

  • /create-jwt

  • /get-jwt

profile
전 체리 알러지가 있어요!

0개의 댓글