본문 바로가기
컴퓨터 프로그래밍/Spring

[Spring] JWT 다루기

by 한33 2024. 8. 24.

토큰 생성에 필요한 데이터

  • Base64로 Encode된 Secret Key를 properties에 작성해두고 @Value를 통해 가져옵니다.
  • JWT를 생성할 때 가져온 Secret Key로 암호화합니다.
    • 이때 Encode된 Secret Key를 Decode 해서 사용합니다.
    • Key는 Decode된 Secret Key를 담는 객체입니다.
    • @PostConstruct는 딱 한 번만 받아오면 되는 값을 사용 할 때마다 요청을 새로 호출하는 실수를 방지하기 위해 사용됩니다.
      • JwtUtil 클래스의 생성자 호출 이후에 실행되어 Key 필드에 값을 주입 해줍니다.
  • 암호화 알고리즘은 HS256 알고리즘을 사용합니다.
  • Bearer 란 JWT 혹은 OAuth에 대한 토큰을 사용한다는 표시입니다.
  • 로깅이란 애플리케이션이 동작하는 동안 프로젝트의 상태나 동작 정보를 시간순으로 기록하는 것을 의미합니다.
    • 우리는 Logback 로깅 프레임워크를 사용해서 로깅을 진행하도록 하겠습니다.


JWT 생성

  • JWT의 subject에 사용자의 식별값 즉, ID를 넣습니다.
  • JWT에 사용자의 권한 정보를 넣습니다. key-value 형식으로 key 값을 통해 확인할 수 있습니다.
  • 토큰 만료시간을 넣습니다. ms 기준입니다.
  • issuedAt에 발급일을 넣습니다.
  • signWith에 secretKey 값을 담고있는 key와 암호화 알고리즘을 값을 넣어줍니다.
    • ket와 암호화 알고리즘을 사용하여 JWT를 암호화합니다.

JWT Cookie에 저장


받아온 Cookie의 Value인 JWT 토큰 substring

  • StringUtils.hasText를 사용하여 공백, null을 확인하고 startsWith을 사용하여 토큰의 시작값이 Bearer이 맞는지 확인합니다.
  • 맞다면 순수 JWT를 반환하기 위해 substring을 사용하여 Bearer을 잘라냅니다.

JWT 검증

  • Jwts.parserBuilder() 를 사용하여 JWT를 파싱할 수 있습니다.
  • JWT가 위변조되지 않았는지 secretKey(key)값을 넣어 확인합니다.

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

  • JWT의 구조 중 Payload 부분에는 토큰에 담긴 정보가 들어있습니다.
  • 여기에 담긴 정보의 한 ‘조각’ 을 클레임(claim) 이라고 부르고, 이는 key-value 의 한 쌍으로 이뤄져있습니다. 토큰에는 여러개의 클레임 들을 넣을 수 있습니다.
  • Jwts.parserBuilder() 와 secretKey를 사용하여 JWT의 Claims를 가져와 담겨 있는 사용자의 정보를 사용합니다.

JWT 테스트