Spring Security를 사용하여 JWT를 생성하고 인증해보자
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
implementation 'org.springframework.boot:spring-boot-starter-websocket'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'
프로젝트 폴더 안에 service 폴더를 하나 만들고 AuthService 클래스 파일을 만든다
/* service/AuthService */
@Service
@RequiredArgsConstructor
public class AuthService {
private final UserRepository userRepository;
private final JwtUtil jwtUtil;
@Value("${jwt.secret}")
private String secretKey;
private Long exprTime = 1000 * 60 * 60L;
public String login(LoginRequestDto dto) throws GlobalException {
String id = dto.getId();
String email = dto.getEmail();
try {
if(id == null || email == null) {
throw new GlobalException(ErrorCode.BAD_REQUEST_AUTH);
}
String token = jwtUtil.createJwt(id, email, secretKey, exprTime);
return token;
} catch (GlobalException e) {
throw new GlobalException(ErrorCode.INTERNAL_SERVER_ERROR);
}
}
}
프로젝트 폴더 안에 utils 폴더를 만들고 JwtUtil 클래스 파일을 만든다
@RequiredArgsConstructor
를 사용해서 UserRepository와 JwtUtil 파일을 의존성 주입한다
login함수가 호출이 되면 LoginRequestDto 값이 null이 아닌지 확인하고
JwtUtil 파일에 정의되어있는 creatJwt() 함수를 호출하여 JWT를 생성한다
@Value 어노테이션을 사용하면 application.yml
에 JWT를 생성하는데 필요한 secretKey를 지정하여 .gitignore를 사용하여 숨길 수 있다
jwt:
secret: 시크릿 키를 적으세요
@Value("${jwt.secret}")
private String secretKey;
/* utils/JwtUtil */
@Component
public class JwtUtil {
public static String createJwt(String id, String email, String secretKey, Long exprTime) {
Claims claims = Jwts.claims();
claims.put("id", id);
claims.put("email", email);
return Jwts
.builder()
.setClaims(claims)
.setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + exprTime))
.signWith(SignatureAlgorithm.HS256, secretKey)
.compact();
}
}
Claims claims = Jwts.claims();
claims.put("id", id);
claims.put("email", email);
Claims 객체를 생성하여 자신이 JWT에 period로 넣을 값을 삽입한다