Spring Security를 사용하여 JWT를 생성하고 인증해보자

  • build.gradle
    라이브러리를 추가하자
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로 넣을 값을 삽입한다

  • setClaims() : claims 객체 주입
  • setIssuedAt() : JWT를 생성한 시간
  • setExpiration() : 만료시간 설정
  • signWith() : 알고리즘, secretKey 설정 (HS256을 많이 사용함)
  • compact()
profile
Backend Developer

0개의 댓글