Spring Security 적용- JWT(Json Web Token) 발급
- Token Filter 계층 추가 및 권한 부여
- Token 유효성 검사
- Token 데이터 파싱
JWT(Json Web Token) 발급
- jjwt를 gradle에 추가합니다.
- JwtUil.Class를 생성하여 createJwt 메서드를 생성합니다.
- UserService를 생성하여 login 비즈니스 로직을 구체화합니다.
- token 생성
jjwt(json web token) gradle에 추가
implementation 'io.jsonwebtoken:jjwt:0.9.1'
JwtUtil.Class 생성
- util 패키지를 생성 후 JwtUtil.Class를 생성합니다. (클래스 이름은 수정이 가능합니다)
public class JwtUtil {
public static String createJwt(String userName, String secretKey, Long expiredMs){
Claims claims = Jwts.claims(); // 일종의 맵 형태인 Claim
claims.put("userName",userName);
return Jwts.builder()
.setClaims(claims)
.setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + expiredMs))
.signWith(SignatureAlgorithm.HS256, secretKey)
.compact();
}
}
UserService 생성 후 비즈니스 로직 구체화
@Service
@RequiredArgsConstructor
public class UserService {
@Value("${jwt.secret}")
private String secretKey;
private Long expiredMs = 1000 * 60 * 60l;
public String login(String userName, String password){
// 인증 과정은 생략
return JwtUtil.createJwt(userName, secretKey, expiredMs);
}
}
@Value("${jwt.secret}") yml 설정
직접적으로 secret key를 노출하여 git hub 등 외부에 노출하게 되면, 보안에 매우 취약해지므로 이러한 비밀 키들을 숨겨야 합니다.
@Value를 활용하여 yml, propertise 또는 환경 변수에 있는 값을 불러옵니다.
저희는 환경 변수를 이용할 예정입니다.
환경 변수를 이용하기 위해 먼저 yml에 허수를 집어넣습니다.
application.yml
jwt:
secret: hello
environment variables 설정
Run/Debug Configurations의 Environment Variables에서 yml에 설정한 이름(JWT_SECRET)을 입력하고 Value 값을 지정합니다.
SECRET KEY 설정 시 주의할 점.
Secret Key가 너무 짧을 경우 java.lang.IllegalArgumentException: secret key byte array cannot be null or empty.
에러가 발생할 수 있습니다.
충분히 긴 길이의 Secret Key를 지정해야 합니다.
Controller의 Login API에 UserService 적용
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/users")
public class UserController {
private final UserService userService;
@PostMapping("/login")
public ResponseEntity<String> login(){
return ResponseEntity.ok().body(userService.login("",""));
}
}
Token 반환 확인하기 (1)
UserService를 구체화하고, UserController의 Login 부분을 수정하였다.
잘 작동하는지 Talend를 통하여 테스트 하자.
java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter
라는 에러가 발생하였다
java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter
에러 해결
gradle에 javax.xml.bind를 추가합니다.
implementation 'javax.xml.bind:jaxb-api:2.3.1'
해당 에러는 Java 9 버전으로 올라가면서 모듈이 제거되고, Java 11버전에 이르러서는 JAXV API가 JDK에서 완전히 제거되면서 발생한 에러입니다.
base64Codec.java 파일이 javax.xml.bind.DatatypeConver를 리런할 때 해당 API가 없어서 에러가 발생한 것.
Token 반환 확인하기 (2)
다시 API를 Send하니 이번에는 Token 값이 올바르게 발급되었다.
'회고록 > Archive' 카테고리의 다른 글
[Spring Security & JWT] 4. Token 유효성 검사 (0) | 2022.12.06 |
---|---|
[Spring Security & JWT] 3. Token Filter 계층 추가 및 권한 부여 (0) | 2022.12.06 |
[Spring Security & JWT] 1. Security 적용 (0) | 2022.12.06 |
retrospect: 멋쟁이 사자처럼 백앤드 스쿨 2022.11.16 회고 (0) | 2022.12.04 |
retrospect: 멋쟁이 사자처럼 백앤드 스쿨 2022.11.01 회고 (1) | 2022.12.02 |