Web application

JSON Web Token w Spring Boot

jwt

JSON Web Token

JSON Web Token jest drugim najpopularniejszym obok Basic Authentication (autoryzacja z wykorzystaniem loginu i hasła) sposobem autoryzacji.
Na podstawie tokenu, który jest przechowywany po stronie klienta, można uzyskać dostęp do zasobów serwera. Najczęściej JWT jest stosowany do autoryzacji przy dostępie do API.

Budowa tokena

JSON posiada trzy kluczowe elementy:

  • Header – przechowuje on informacje na temat algorytmu szyfrowania oraz typie tokena.
  • Payload – dowolny przekazywany ładunek. Najczęściej są w nim przechowywane informacje na temat roli i praw użytkownika, czy też długości życia dla tokena.
  • Verify – podpis cyfrowy, który składa się z zaszyfrowanego Headera i Paylodu. Stanowi on sumę kontrolną.

Token, który trafia do serwera od klienta jest parsowany, a następnie weryfikowany pod kontem prawidłowości, uprawnień, ważności, TTL i innych.

Implementacja w Spring Boot

Wykorzystanie JWT w Spring Boot jest możliwe z wykorzystaniem zależności:

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
</dependency>

Przykładowa implementacja metody generującej token może wyglądać następująco:

@PostMapping("/user/login")
public String login(@RequestBody User user) {
    Long now = System.currentTimeMillis();
    return Jwts.builder()
            .setSubject(user.getLogin()) // 1
            .claim("roles", "user") // 2
            .setIssuedAt(new Date(now)) // 3
            .setExpiration(new Date(now + 10000)) // 4
            .signWith(SignatureAlgorithm.HS512, "secretkey").compact(); // 5
}

Do metody Post przekazywany jest użytkownik. W komentarzach z numerami 1, 2, 3, 4 tworzony jest Payload w ramach, którego dostarczone są kolejno nazwa użytkownika (Subject), uprawnienia użytkownika, początkowa ważność klucza, data wygaśnięcia klucza.
W komentarzu 5 klucz jest haszowany a następnie zamieniany do postaci ciągu tekstowego.

Prasowanie klucza odbywa poprzez wywołanie metody parseClaimsJws:

Claims claims = Jwts.parser().setSigningKey("secretkey").parseClaimsJws(token).getBody();

Obiekt klasy Claims przechowują informacje przekazane w tokenie, które w następnej kolejności można zweryfikować i przetwarzać.

Materiały dodatkowe

Przykładowa aplikacja jest dostępna w serwisie GitHub:
https://github.com/bykowski/springboot-jwt

Wideo, w trakcie którego krokowo opowiadam wykorzystanie mechanizmów wraz z implementacja dostępne na kanale:

Tags:
Show Buttons
Hide Buttons