1. build.gradle
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
implementation 'org.springframework.boot:spring-boot-starter-security'
2. 토큰 생성하는 JwtTokenUtils.java 클래스 만들기
package com.example.sns.util;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.util.Date;
public class JwtTokenUtils {
public static String generateToken(String userName, String key, long expiredTimeMs){
Claims claims = Jwts.claims();
claims.put("userName", userName);
return Jwts.builder()
.setClaims(claims)
.setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + expiredTimeMs))
.signWith(getKey(key), SignatureAlgorithm.HS256)
.compact();
}
private static Key getKey(String key){
byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);
return Keys.hmacShaKeyFor(keyBytes);
}
}
3. 서비스/로그인 메서드에서 JwtTokenUtils.generateToken() 스태틱 메서드 호출해서 token 받기
@Value("${jwt.secret-key}")
private String secretKey;
@Value("${jwt.token.expired-time-ms}")
private Long expiredTimeMs;
public String login(String userName, String password){
// 회원가입 여부 체크
UserEntity userEntity = userEntityRepository.findByUserName(userName).orElseThrow(()->new SnsApplicationException(ErrorCode.USER_NOT_FOUND, String.format("%s not founded", userName )));
// 비밀번호 체크
if(!encoder.matches(password, userEntity.getPassword())){
throw new SnsApplicationException(ErrorCode.INVALID_PASSWORD);
}
// 토큰 생성
String token = JwtTokenUtils.generateToken(userName, secretKey, expiredTimeMs);
return token;
}
4. jwt token 만드는데 필요한 secret-key 값과 expired 시간 값은 application.yml에 따로 저장
jwt:
secret-key: fast_campus.sns-application-2022.secret_key
# 30day
token:
expired-time-ms: 2592000000
'보안 > Security-인증' 카테고리의 다른 글
IAM Role 설명 (0) | 2024.03.17 |
---|---|
JWT의 구조 정리 (0) | 2023.07.30 |
JWT, 세션 인증 (0) | 2023.04.06 |
Spring Security 페이지 권한 설정 방법 (authorization) (0) | 2022.11.20 |
댓글