1. JWT 인증
Json Web Token
인증에 필요한 정보들을 토큰에 담아 암호화시켜 사용하는 방식이다.
서명된 토큰이라는 점에서 쿠키보다 더 보안성이 높다.
JWT의 구조
Header, Payload, Signature의 구성 요소로 이루어지며 각 구성 요소가 마침표(.)로 구분된다.
Header - 토큰의 타입이나, 서명 생성에 사용되는 알고리즘을 저장한다.
Payload - 토큰에 담을 정보를 key-value 형태로 저장한다.
Signature - 서명이 저장되는데 암호화되어 있기 때문에 서버에 있는 개인 키로만 복호화가 가능하다.
2. JWT 생성
1) dependencies 추가
<!-- jjwt -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<!-- spring-security-jwt -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-jwt</artifactId>
<version>1.0.10.RELEASE</version>
</dependency>
2) createJwt 메소드에서 builder 패턴을 이용해 JWT를 생성
setHeaderParam() - type 설정
claim() - Payload에 담을 데이터를 입력
setIssuedAt() - 발급 시간 입력
setExpiration() - 해당 JWT의 만료 시간 입력
signWith() - 서명 알고리즘과 비밀 키 입력
서명 알고리즘으로 HS256을 선택한다면 비밀 키는 별도의 클래스에서 관리한다.
깃 허브에 올릴 때는 해당 파일을 .gitignore에 추가하기
compact() - 설정대로 JWT 토큰을 생성
public String createToken(Authentication authentication) {
String authorities = authentication.getAuthorities().stream()
.map(GrantedAuthority::getAuthority)
.collect(Collectors.joining(","));
long now = (new Date()).getTime();
Date validity = new Date(now + this.tokenValidityInMilliseconds);
return Jwts.builder()
.setSubject(authentication.getName())
.claim(AUTHORITIES_KEY, authorities)
.signWith(key, SignatureAlgorithm.HS512)
.setExpiration(validity)
.compact();
}
// 내가 구현한 코드
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String clientIP = getClientIpAddr(request);
String token = request.getHeader("Authorization");
String requestURI = request.getRequestURI();
// Token 유효성 체크
if (token != null && token.startsWith("Bearer ")) {
token = token.replace("Bearer ", "");
PublicKey publicKey;
publicKey = cache.getPublicKey(applicationOauth.getPublicKey());
// JWT 파싱
Jws<Claims> claims;
claims = Jwts.parser().setSigningKey(publicKey).parseClaimsJws(token);
Claims body = claims.getBody();
userId = String.valueOf(body.get("userId"));
//구현할 코드 입력
.
.
.
}
else {
// 인증 토큰 없음 - 401 에러
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Target of URI doesn't exist.");
return false;
}
return true;
}
request.header 에서 token 정보를 받아 해당 토큰의 유효성을 검사하고 JWT 를 파싱한다.
이후 파싱 된 데이터로 원하는 코드를 구현하면 된다.
발급 된 토큰 정보는 jwt.io 에서 확인 가능하다.
'JAVA > Spring' 카테고리의 다른 글
[JAVA] find image file size - File 이미지 크기(가로X세로) 구하기 (0) | 2024.01.10 |
---|---|
[JAVA] 이미지 URL 변환 후 화면에 보여주기(가져오기) (feat.미리보기) (0) | 2024.01.09 |
[Spring] Multi module - 모듈 별 application.yml 파일 환경 설정 및 관리하는 방법 (0) | 2023.12.01 |
[JAVA] [Eclipse] project에 Dynamic Web Module 추가하는 방법 (Deployment Assembly) (0) | 2023.11.16 |
[JAVA] Map으로 전달 받은 JsonData List 목록(값) 추출하기 (0) | 2023.11.16 |