본문으로 바로가기
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


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

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