참조: https://substantial-park-a17.notion.site/JWT-7a5cd1cf278a407fae9f35166da5ab03
스프링 시큐리티 JWT | Notion
스프링 부트에 JWT 방식으로 인증을 진행하는 스프링 시큐리티를 적용하고 JWT 발급, 인증/인가를 구현하는 방법
substantial-park-a17.notion.site
스프링 시큐리티 JWT
JWT 발급과 검증
- 로그인시 → 성공 → JWT 발급
- 접근시 → JWT 검증
JWT에 관해 발급과 검증을 담당할 클래스가 필요하다. 따라서 JWTUtil이라는 클래스를 생성하여 JWT 발급, 검증 메소드를 작성하는 시간입니다.
JWT 생성 원리
JWT는 Header.Payload.Signature 구조로 이루어져 있다. 각 요소는 다음 기능을 수행한다.
- Header
- JWT임을 명시
- 사용된 암호화 알고리즘
- Payload
- 정보
- Signature
- 암호화알고리즘((BASE64(Header))+(BASE64(Payload)) + 암호화키)
JWT의 특징은 내부 정보를 단순 BASE64 방식으로 인코딩하기 때문에 외부에서 쉽게 디코딩 할 수 있다.
외부에서 열람해도 되는 정보를 담아야하며, 토큰 자체의 발급처를 확인하기 위해서 사용한다.
(지폐와 같이 외부에서 그 금액을 확인하고 금방 외형을 따라서 만들 수 있지만 발급처에 대한 보장 및 검증은 확실하게 해야하는 경우에 사용한다. 따라서 토큰 내부에 비밀번호와 같은 값 입력 금지)
JWT 암호화 방식
- 암호화 종류
- 양방향
- 대칭키 - 이 프로젝트는 양방향 대칭키 방식 사용 : HS256
- 비대칭키
- 단방향
- 양방향
암호화 키 저장
암호화 키는 하드코딩 방식으로 구현 내부에 탑재하는 것을 지양하기 때문에 변수 설정 파일에 저장한다.
- application.properties
spring.jwt.secret=vmfhaltmskdlstkfkdgodyroqkfwkdbalroqkfwkdbalaaaaaaaaaaaaaaaabbbbb
JWTUtil
- 토큰 Payload에 저장될 정보
- username
- role
- 생성일
- 만료일
- JWTUtil 구현 메소드
- JWTUtil 생성자
- username 확인 메소드
- role 확인 메소드
- 만료일 확인 메소드
- JWTUtil : 0.12.3
@Component
public class JWTUtil {
private SecretKey secretKey;
public JWTUtil(@Value("${spring.jwt.secret}")String secret) {
secretKey = new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), Jwts.SIG.HS256.key().build().getAlgorithm());
}
public String getUsername(String token) {
return Jwts.parser().verifyWith(secretKey).build().parseSignedClaims(token).getPayload().get("username", String.class);
}
public String getRole(String token) {
return Jwts.parser().verifyWith(secretKey).build().parseSignedClaims(token).getPayload().get("role", String.class);
}
public Boolean isExpired(String token) {
return Jwts.parser().verifyWith(secretKey).build().parseSignedClaims(token).getPayload().getExpiration().before(new Date());
}
public String createJwt(String username, String role, Long expiredMs) {
return Jwts.builder()
.claim("username", username)
.claim("role", role)
.issuedAt(new Date(System.currentTimeMillis()))
.expiration(new Date(System.currentTimeMillis() + expiredMs))
.signWith(secretKey)
.compact();
}
}
- JWTUtil : 0.11.5
@Component
public class JWTUtil {
private Key key;
public JWTUtil(@Value("${spring.jwt.secret}")String secret) {
byte[] byteSecretKey = Decoders.BASE64.decode(secret);
key = Keys.hmacShaKeyFor(byteSecretKey);
}
public String getUsername(String token) {
return Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody().get("username", String.class);
}
public String getRole(String token) {
return Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody().get("role", String.class);
}
public Boolean isExpired(String token) {
return Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody().getExpiration().before(new Date());
}
public String createJwt(String username, String role, Long expiredMs) {
Claims claims = Jwts.claims();
claims.put("username", username);
claims.put("role", role);
return Jwts.builder()
.setClaims(claims)
.setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + expiredMs))
.signWith(key, SignatureAlgorithm.HS256)
.compact();
}
}
'Java Spring Boot' 카테고리의 다른 글
[ erd_cloud 상품_위치 관계 테이블 작성 ] (0) | 2024.04.08 |
---|---|
[ Java_ JWT 설정 시, 참고 파일, 영상 ] (0) | 2024.04.04 |
[Java] Optional 올바르게 사용하기 (0) | 2024.03.30 |
[ Java / 생성자, 상속(extends) ] (0) | 2024.03.28 |
[ Java 문법 _ 객체 / 생성자 ] (0) | 2024.03.28 |