- Util 클래스
- 특정 매개 변수(파라미터)에 대한 작업을 수행하는 메서드들이 존재하는 클래스
- 다른 객체에 의존하지 않고 하나의 모듈로서 동작하는 클래스
- <JWT 관련 기능>
- JWT 생성
- 생성된 JWT를 Cookie에 저장
- Cookie에 들어있던 JWT 토큰을 Substring
- Substring: 특정 구간 문자열 자르기
- JWT 검증
- 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를 가져와 담겨 있는 사용자의 정보를 사용
/create-jwt
/get-jwt