728x90
반응형
JWT 발급과 검증
- JWT를 발급 가능
- 유효하지 않은 JWT에 대한 Request 요청 거부
- 각각의 API에서 처리하지 말고 DispatcherServlet 레벨에서 헤더를 검증해 처리해보기
Source: https://github.com/jak010/SpringBootWithJava/tree/study/authenticate
Dependency
# budle.gradle
implementation 'io.jsonwebtoken:jjwt-api:0.11.2'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.2',
// Uncomment the next line if you want to use RSASSA-PSS (PS256, PS384, PS512) algorithms:
//'org.bouncycastle:bcprov-jdk15on:1.60',
'io.jsonwebtoken:jjwt-jackson:0.11.2' // or 'io.jsonwebtoken:jjwt-gson:0.11.2' for gson
- runtimeOnly 모듈 없이 jjwt 라이브러리 이용할 시에 이슈
- 관련 블로그: https://loosie.tistory.com/29
- 관련 Issue: https://github.com/jwtk/jjwt/issues/447
SecretKey 생성하기
JWT 검증에 필요한 Secret Key를 생성하기
import io.jsonwebtoken.security.Keys;
import java.nio.charset.StandardCharsets;
@Component
public class JwtManager {
private SecretKey key = Keys.hmacShaKeyFor("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
.getBytes(StandardCharsets.UTF_8));
...
}
- Paramter 값을 보면 String을 통해 넣고 있는데 Bytes로 변환한다.
- 주의 사항
- Message의 내용이 256 bit보다 커야 한다
- 영어 한단어당 8비트(1바이트) 이므로 32글자 이상으로 지정해줘야 한다.
- 한글은 1글당 16비트 (2바이트) 이므로 16글자이상이어 한다.
- Exception
- io.jsonwebtoken.security.WeakKeyException
- 주의 사항
jwt Create
JWT를 생성한 뒤 Request시에 JSON Object로 Response 해주자
/**
* JWT를 생성하는 메서드입니다. <br/>
* - TEST 를 위해 Claim 정보는 토큰 생성 시점에 임의로 넣어줍니다 <br/>
*/
public String createToken() {
Claims claims = Jwts.claims().setSubject("abcd");
claims.put("testKey", "testValue");
Date now = new Date();
return Jwts.builder()
.setClaims(claims)
.setIssuedAt(now)
.setExpiration(new Date(now.getTime() + tokenValidTime))
.signWith(key)
.compact();
}
토큰 발급하기
public String publishToken() {
JSONObject jObj = new JSONObject();
jObj.put("x-access-token", this.createToken());
return jObj.toString();
}
Response: { "x-access-token": JWT }
Authenticate 단계
- Interceptor 단계에서 토큰을 검증해 로그인 시키기
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (request.getHeader("x-access-token") != null) {
jwtManager.verify(request.getHeader("x-access-token");
}
return true;
}
Appendix
- curl로 GET 요청을 시도할 때 EOFException 날 때가 있음
- Solve
- curl -H "Connection: close" 설정해서 보내자
- Issue
- Solve
728x90
반응형
'Frame Work > Spring Boot' 카테고리의 다른 글
[Study] Interceptor와 Servletfilter (0) | 2021.12.08 |
---|---|
[JPA] JpaRepository를 통해 Pagination 처리하기 (0) | 2021.12.07 |
[Spring Boot] Getter, Setter (0) | 2021.06.20 |
[Spring Boot] 시작하기 (0) | 2021.06.20 |