SlideShare a Scribd company logo
JWT
To infinity

& beyond!
authentication
Luís Cobucci

@lcobucci
https://goo.gl/gbd3H5
Tokens?
https://goo.gl/C0LI6F
Browser
Server DB
Browser
Server
1. presents credentials
POST /login


{

"email": "aa@aa.com",
"password": "amazing!"

}
DB
Browser
Server DB
1. presents credentials
2. validates and starts a session
Browser
Server DB
1. presents credentials
2. validates and starts a session
200 OK
Set-Cookie: PHPSESSIONID=ABC123;
Domain=foo.bar; Secure; HttpOnly;
Expires=Thu, 1 Jun 2017 12:00:00
GMT
Browser
Server DB
1. presents credentials
2. validates and starts a session
200 OK
Set-Cookie: PHPSESSIONID=ABC123;
Domain=foo.bar; Secure; HttpOnly;
Expires=Thu, 1 Jun 2017 12:00:00
GMT
Browser
Server DB
1. presents credentials
2. validates and starts a session
3. sends cookies on next requests
GET /
Cookie: PHPSESSIONID=ABC123
Browser
Server DB
1. presents credentials
2. validates and starts a session
3. sends cookies on next requests
4. reads session data and returns a
specific response for logged user
200 OK
Hello John!
“ (…) Each request from any client
contains all the information
necessary to service the request, and
session state is held in the client.
Representational State Transfer - Wikipedia
A mission
http://goo.gl/RfVHNu
{
"token": "abc123", "uid": 1, "expiration": "…",

"scope": ["a", "b", "c"]
}
{
"token": "abc123", "uid": 1,

"expiration": "…", "scope": ["a", "b", "c"]
}
{
"token": "def123", "uid": 2,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "abc123", "uid": 1,

"expiration": "…", "scope": ["a", "b", "c"]
}
{
"token": "def123", "uid": 2,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "abc456", "uid": 3,

"expiration": "…", "scope": ["a", "b", "c"]
}
{
"token": "def456", "uid": 4,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "abc123", "uid": 1,

"expiration": "…", "scope": ["a", "b", "c"]
}
{
"token": "def123", "uid": 2,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "abc456", "uid": 3,

"expiration": "…", "scope": ["a", "b", "c"]
}
{
"token": "def456", "uid": 4,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "abc789", "uid": 5,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "def789", "uid": 6,

"expiration": "…", "scope": ["a"]
}
{
"token": "ghi123", "uid": 1,

"expiration": "…", "scope": ["a", "b", "c"]
}
{
"token": "jkl123", "uid": 2,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "ghi456", "uid": 3,

"expiration": "…", "scope": ["a", "b", "c"]
}
{
"token": "jkl456", "uid": 4,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "ghi789", "uid": 5,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "jkl789", "uid": 6,

"expiration": "…", "scope": ["a"]
}
{
"token": "abc123", "uid": 1,

"expiration": "…", "scope": ["a", "b", "c"]
}
{
"token": "def123", "uid": 2,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "abc456", "uid": 3,

"expiration": "…", "scope": ["a", "b", "c"]
}
{
"token": "def456", "uid": 4,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "abc789", "uid": 5,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "def789", "uid": 6,

"expiration": "…", "scope": ["a"]
}
{
"token": "ghi123", "uid": 1,

"expiration": "…", "scope": ["a", "b", "c"]
}
{
"token": "jkl123", "uid": 2,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "ghi456", "uid": 3,

"expiration": "…", "scope": ["a", "b", "c"]
}
{
"token": "jkl456", "uid": 4,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "ghi789", "uid": 5,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "jkl789", "uid": 6,

"expiration": "…", "scope": ["a"]
}
{
"token": "abc123", "uid": 1,

"expiration": "…", "scope": ["a", "b", "c"]
}
{
"token": "def123", "uid": 2,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "abc456", "uid": 3,

"expiration": "…", "scope": ["a", "b", "c"]
}
{
"token": "def456", "uid": 4,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "abc789", "uid": 5,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "def789", "uid": 6,

"expiration": "…", "scope": ["a"]
}
{
"token": "ghi123", "uid": 1,

"expiration": "…", "scope": ["a", "b", "c"]
}
{
"token": "jkl123", "uid": 2,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "ghi456", "uid": 3,

"expiration": "…", "scope": ["a", "b", "c"]
}
{
"token": "jkl456", "uid": 4,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "ghi789", "uid": 5,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "jkl789", "uid": 6,

"expiration": "…", "scope": ["a"]
}
{
"token": "abc123", "uid": 1,

"expiration": "…", "scope": ["a", "b", "c"]
}
{
"token": "def123", "uid": 2,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "abc456", "uid": 3,

"expiration": "…", "scope": ["a", "b", "c"]
}
{
"token": "def456", "uid": 4,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "abc789", "uid": 5,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "def789", "uid": 6,

"expiration": "…", "scope": ["a"]
}
{
"token": "ghi123", "uid": 1,

"expiration": "…", "scope": ["a", "b", "c"]
}
{
"token": "jkl123", "uid": 2,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "ghi456", "uid": 3,

"expiration": "…", "scope": ["a", "b", "c"]
}
{
"token": "jkl456", "uid": 4,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "ghi789", "uid": 5,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "jkl789", "uid": 6,

"expiration": "…", "scope": ["a"]
}
{
"token": "abc123", "uid": 1,

"expiration": "…", "scope": ["a", "b", "c"]
}
{
"token": "def123", "uid": 2,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "abc456", "uid": 3,

"expiration": "…", "scope": ["a", "b", "c"]
}
{
"token": "def456", "uid": 4,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "abc789", "uid": 5,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "def789", "uid": 6,

"expiration": "…", "scope": ["a"]
}
{
"token": "ghi123", "uid": 1,

"expiration": "…", "scope": ["a", "b", "c"]
}
{
"token": "jkl123", "uid": 2,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "ghi456", "uid": 3,

"expiration": "…", "scope": ["a", "b", "c"]
}
{
"token": "jkl456", "uid": 4,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "ghi789", "uid": 5,

"expiration": "…", "scope": ["a", "b"]
}
{
"token": "jkl789", "uid": 6,

"expiration": "…", "scope": ["a"]
}
Wonderful, right?
http://goo.gl/9jQFkj
No!
http://goo.gl/XHI1fw
We need

SIMPLE !it
Luís Cobucci

@lcobucci
JOSEJSON Object Signing and Encryption
JOSEJSON Object Signing and Encryption
jws jwa
jwt jwe
jwk
eyJ0eXAiOiJKV1QiLCJhbGciOiJ
IUzI1NiJ9.eyJ1c2VyIjp7ImlkI
joxLCJuYW1lIjoiTHXDrXMgQ29i
dWNjaSJ9fQ.
eyJ0eXAiOiJKV1QiLCJhbGciOiJ
IUzI1NiJ9.eyJ1c2VyIjp7ImlkI
joxLCJuYW1lIjoiTHXDrXMgQ29i
dWNjaSJ9fQ.
base64_encode()
eyJ0eXAiOiJKV1QiLCJhbGciOiJ
IUzI1NiJ9.eyJ1c2VyIjp7ImlkI
joxLCJuYW1lIjoiTHXDrXMgQ29i
dWNjaSJ9fQ.
eyJ0eXAiOiJKV1QiLCJhbGciOiJ
IUzI1NiJ9
.
eyJ1c2VyIjp7ImlkIjoxLCJuYW1
lIjoiTHXDrXMgQ29idWNjaSJ9fQ
.
Base64URL
eyJ0eXAiOiJKV1QiLCJhbGciOiJ
IUzI1NiJ9
.
eyJ1c2VyIjp7ImlkIjoxLCJuYW1
lIjoiTHXDrXMgQ29idWNjaSJ9fQ
.
+ → -

/ → _

= → (removed)
TeSJWlQ/
S4YaOgK5tz7j+3KxBA
g3HTONa9NP80R+9mY=
TeSJWlQ_S4YaOgK5tz7
j-3KxBAg3HTONa9NP80
R-9mY
function base64url_encode(string $data): string {
$data = base64_encode($data);


return rtrim(

strtr($data, '+/', '-_'),
'='
);
}
function base64url_decode(string $data): string {

if ($remainder = strlen($data) % 4) {
$data .= str_repeat('=', 4 - $remainder);
}
return base64_decode(

strtr($data, '-_', '+/')
);
}
eyJ0eXAiOiJKV1QiLCJhbGciOiJ
IUzI1NiJ9
.
eyJ1c2VyIjp7ImlkIjoxLCJuYW1
lIjoiTHXDrXMgQ29idWNjaSJ9fQ
.
{

"typ": "JWT",

"alg": "none"

}
{

"user": {

"id": 1,

"name": "Luís Cobucci"

}

}
The JSON!
http://goo.gl/gH0hsx
401
Unauthorised
http://goo.gl/yyZ7oC
Client
API DB
1. presents credentials
POST /auth


{

"email": "aa@aa.com",
"password": "amazing!"

}
Client
API DB
1. presents credentials
2. validates and creates a token
Client
API
- issuer: auth.example.com
- permitted to: client.example.com
- expires in 300 seconds
DB
1. presents credentials
2. validates and creates a token
201 Created


{

"token": "…"

}
Client
API DB
1. presents credentials
2. validates and creates a token
3. sends the issued token
GET /
Authorization: …
Client
API DB
1. presents credentials
2. validates and creates a token
3. sends the issued token
4. verifies the signature, validates the
claims and processes the request
- is it valid?
- client allowed?
- expected issuer?
- can it be used at this moment?
Client
API DB
How about OAuth2?
Sessions
https://goo.gl/KNrl16
file
Webserver
Set-Cookie:

SESSION_ID=123abc
file a
Webserver
Client
SESSION_ID=123abc
file a
Webserver 1
Client
SESSION_ID=123abc
file b
Webserver 2
file c
Webserver 3
Load balancer
Webserver 1
Client
SESSION=eyJ0eXAiOiJKV1QiLCJhbGciO
iJIUzI1NiJ9.eyJ1c2VyIjp7ImlkIjoxL
CJuYW1lIjoiTHXDrXMgQ29idWNjaSJ9fQ
.hv9V7gBBJPeWMbwFFmRP7clLuof7r9fV
JzZbLZIxBTs
Webserver 2 Webserver 3
Load balancer
!
1. cannot store private information
in the session



2. sessions cannot be invalidated


3. increased network traffic



4. race conditions with highly
concurrent HTTP requests writing
to session



5. limit on the amount of data
stored in session
JWT - To authentication and beyond!
More!!
https://goo.gl/gEjEMm
https://goo.gl/GB6YkQ
Let’s investigate it
{

"typ": "JWT",

"alg": "none"

}
{

"user": {

"id": 1,

"name": "Luís Cobucci"

}

}
headers
{

"typ": "JWT",

"alg": "none"

}
{

"user": {

"id": 1,

"name": "Luís Cobucci"

}

}
headers
{

"typ": "JWT",

"alg": "none"

}
{

"user": {

"id": 1,

"name": "Luís Cobucci"

}

}
claims
Base64URL( )

+ "." + 

Base64URL( )

+ "."
headers
claims
headers
{

"typ": "JWT",

"alg": "none"

}
{

"user": {

"id": 1,

"name": "Luís Cobucci"

}

}
claims
eyJhbGciOiJub25lIiwidHlwIjo
iSldUIn0

.

eyJ1c2VyIjp7ImlkIjoxLCJuYW1
lIjoiTHXDrXMgQ29idWNjaSJ9fQ

.
Can you trust it?
https://goo.gl/EeeIdu
Base64URL( )

+ "." + 

Base64URL( )
headers
claims
payload
Base64URL( )

+ "." + 

Base64URL( )
headers
claims
payload
= alg( , )payload keysignature
Base64URL( )

+ "." + 

Base64URL( )

+ "." + 

Base64URL( )
headers
claims
signature
function jwt_create(
array $headers,
array $claims,
string $key
): string {

$headers = base64url_encode(json_encode($headers));

$claims = base64url_encode(json_encode($claims));
$payload = $headers . '.' . $claims;
$signature = base64url_encode(

hash_hmac('sha256', $payload, $key, true)

);
return $payload . '.' . $signature;
}
What
algorithms?
https://goo.gl/qNTg3D
HS256
HS384
HS512
RS256
RS384
RS512
ES256
ES384
ES512
PS256
PS384
PS512
none
HMAC
RSA
ECDSA
RSASSA-PSS
HS256
HS384
HS512
RS256
RS384
RS512
ES256
ES384
ES512
PS256
PS384
PS512
none
HMAC
RSA
ECDSA
RSASSA-PSS
HS256
HS384
HS512
RS256
RS384
RS512
ES256
ES384
ES512
PS256
PS384
PS512
none
HMAC
RSA
ECDSA
RSASSA-PSS
headers
{

"typ": "JWT",

"alg": "HS256"

}
{

"user": {

"id": 1,

"name": "Luís Cobucci"

}

}
claims
key
Hello JWT+JWS!
eyJhbGciOiJub25lIiwidHlwIjo
iSldUIn0

.

eyJ1c2VyIjp7ImlkIjoxLCJuYW1
lIjoiTHXDrXMgQ29idWNjaSJ9fQ

.

hv9V7gBBJPeWMbwFFmRP7clLuof
7r9fVJzZbLZIxBTs
How much data?
https://goo.gl/eHFQwO
iat (NumericDate)
exp (NumericDate)
nbf (NumericDate)
jti (String)
iss (StringOrUri)
aud (StringOrUri[])
sub (StringOrUri)
iat (NumericDate)
exp (NumericDate)
nbf (NumericDate)
jti (String)
iss (StringOrUri)
aud (StringOrUri[])
sub (StringOrUri)
case-sensitive
https://goo.gl/bkXMeq
Revoke tokens?
PHP libraries!
https://goo.gl/bGP8u8
JWT - To authentication and beyond!
JWT - To authentication and beyond!
declare(strict_types=1);
require 'vendor/autoload.php';
use LcobucciJWTConfiguration;
use LcobucciJWTSignerKey;
use LcobucciJWTSignerHmacSha256;
return Configuration::forSymmetricSigner(
new Sha256(),
new Key('my super secret key')
);
declare(strict_types=1);
require 'vendor/autoload.php';
use LcobucciJWTConfiguration;
use LcobucciJWTSignerKey;
use LcobucciJWTSignerRsaSha256;
return Configuration::forAsymmetricSigner(
new Sha256(),
new Key('file://private.pem', 'testing'),
new Key('file://public.pem')
);
declare(strict_types=1);
/** @var LcobucciJWTConfiguration $config */
$config = require 'config.php';
$signer = $config->getSigner();
$key = $config->getSigningKey();
$token = $config->createBuilder()
->withClaim('uid', 1)
->getToken($signer, $key);
declare(strict_types=1);
/** @var LcobucciJWTConfiguration $config */
$config = require 'config.php';
$signer = $config->getSigner();
$key = $config->getSigningKey();
$token = $config->createBuilder()
->withClaim('uid', 1)
->identifiedBy(bin2hex(random_bytes(16)))
->getToken($signer, $key);
declare(strict_types=1);
/** @var LcobucciJWTConfiguration $config */
$config = require 'config.php';
$signer = $config->getSigner();
$key = $config->getSigningKey();
$token = $config->createBuilder()
->withClaim('uid', 1)
->identifiedBy(bin2hex(random_bytes(16)))
->issuedBy('https://foo.bar')
->getToken($signer, $key);
declare(strict_types=1);
/** @var LcobucciJWTConfiguration $config */
$config = require 'config.php';
$signer = $config->getSigner();
$key = $config->getSigningKey();
$token = $config->createBuilder()
->withClaim('uid', 1)
->identifiedBy(bin2hex(random_bytes(16)))
->issuedBy('https://foo.bar')

->permittedFor('https://client1.bar')

->permittedFor('https://client2.bar')
->getToken($signer, $key);
declare(strict_types=1);
/** @var LcobucciJWTConfiguration $config */
$config = require 'config.php';
$signer = $config->getSigner();
$key = $config->getSigningKey();
$now = new DateTimeImmutable();
$token = $config->createBuilder()
->withClaim('uid', 1)
->identifiedBy(bin2hex(random_bytes(16)))
->issuedBy('https://foo.bar')

->permittedFor('https://client1.bar')

->permittedFor('https://client2.bar')

->issuedAt($now)

->canOnlyBeUsedAfter($now->modify('+5 minutes'))

->expiresAt($now->modify('+1 hour'))
->getToken($signer, $key);
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9

.

eyJ1aWQiOjEsImp0aSI6ImFhMzk3YzA2ZDUwZmRhNjYyYWUwZGE4OTU2ODdmN
zY3IiwiaXNzIjoiaHR0cHM6Ly9mb28uYmFyIiwiYXVkIjpbImh0dHBzOi8vY2
xpZW50MS5iYXIiLCJodHRwczovL2NsaWVudDIuYmFyIl0sImlhdCI6IjE0OTU
xNzg5MDQuODY4ODc5IiwibmJmIjoiMTQ5NTE3OTIwNC44Njg4NzkiLCJleHAi
OiIxNDk1MTgyNTA0Ljg2ODg3OSJ9

.

jwXzXjm8cU92yxP3XcENg_ZnDvW1MkRTzSoaAwOYCTlSdQ5rv-
dCLn_7_XPLHSuiACt_aFTnB093GYTpJQKRnqIFPYteK2jVnQALXNPxntnp-
v6SMiFBxofCaVSjgKTWdqkWB4agWrTR77HK_iKdFoZMIdpr8UUBJatkc_MCoD
vDMtuDRXwIEBfjs9baICtBvTZyDD7iiMmF4F_qvp2mWd_Qy93gZCrePKAJsgY
-
sujg84iQFOs-6I3GjybzA0U0Y_bTmCmQHfhRUX5_gL21bZxBFef38OFKW73Vx
ehBxM4Ok_nWRbGY7ehsMBshXkJQfp97TJ1cV35a9zyAVXC04A
{

"typ": "JWT",

"alg": "RS256"

}
{

"uid": 1,
"jti": "aa397c06d50fda662ae0da895687f767",
"iss": "https://foo.bar",
"aud": ["https://client1.bar", “https://client2.bar”],
"iat": "1495178904.868879",
"nbf": "1495179204.868879",
"exp": "1495182504.868879"

}
declare(strict_types=1);
/** @var LcobucciJWTConfiguration $config */
$config = require 'config.php';
$jwt = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1aWQiOjEsImp0aSI6ImFh'
. 'Mzk3YzA2ZDUwZmRhNjYyYWUwZGE4OTU2ODdmNzY3IiwiaXNzIjoiaHR0cHM6L'
. 'y9mb28uYmFyIiwiYXVkIjpbImh0dHBzOi8vY2xpZW50MS5iYXIiLCJodHRwcz'
. 'ovL2NsaWVudDIuYmFyIl0sImlhdCI6IjE0OTUxNzg5MDQuODY4ODc5IiwibmJ'

. 'mIjoiMTQ5NTE3OTIwNC44Njg4NzkiLCJleHAiOiIxNDk1MTgyNTA0Ljg2ODg3'
. 'OSJ9.jwXzXjm8cU92yxP3XcENg_ZnDvW1MkRTzSoaAwOYCTlSdQ5rv-dCLn_7'

. '_XPLHSuiACt_aFTnB093GYTpJQKRnqIFPYteK2jVnQALXNPxntnp-v6SMiFBx'

. 'ofCaVSjgKTWdqkWB4agWrTR77HK_iKdFoZMIdpr8UUBJatkc_MCoDvDMtuDRX'

. 'wIEBfjs9baICtBvTZyDD7iiMmF4F_qvp2mWd_Qy93gZCrePKAJsgY-sujg84i'

. 'QFOs-6I3GjybzA0U0Y_bTmCmQHfhRUX5_gL21bZxBFef38OFKW73VxehBxM4O'

. 'k_nWRbGY7ehsMBshXkJQfp97TJ1cV35a9zyAVXC04A';



$token = $config->getParser()->parse($jwt);
declare(strict_types=1);
use LcobucciClockSystemClock;

use LcobucciJWTValidationConstraint;
/** @var LcobucciJWTConfiguration $config */
$config = require 'config.php';
$signer = $config->getSigner();
$key = $config->getVerificationKey();

$token = $config->getParser()->parse('eyJ0eNiJ9 (...)');
$constraints = [
new ConstraintIssuedBy('https://foo.bar', 'https://bar.foo'),
new ConstraintPermittedFor('https://client2.bar'),

new ConstraintValidAt(new SystemClock()),

new ConstraintSignedWith($signer, $key)

];



$config->getValidator()->assert($token, ...$constraints);
declare(strict_types=1);
use LcobucciClockSystemClock;

use LcobucciJWTValidationConstraint;
/** @var LcobucciJWTConfiguration $config */
$config = require 'config.php';
$signer = $config->getSigner();
$key = $config->getVerificationKey();

$token = $config->getParser()->parse('eyJ0eNiJ9 (...)');
$constraints = [
new ConstraintIssuedBy('https://foo.bar', 'https://bar.foo'),
new ConstraintPermittedFor('https://client2.bar'),

new ConstraintValidAt(new SystemClock()),

new ConstraintSignedWith($signer, $key)

];



var_dump($config->getValidator()->validate($token, ...$constraints));
It’s up to you!
https://goo.gl/vYG4zt
JWT
To infinity

& beyond!
authentication
Luís Cobucci

@lcobucci
https://goo.gl/gbd3H5
Thanks!
@lcobucci

More Related Content

What's hot (20)

PDF
MariaDB 마이그레이션 - 네오클로바
NeoClova
 
PPTX
Spring Boot and REST API
07.pallav
 
DOCX
MySQL_SQL_Tunning_v0.1.3.docx
NeoClova
 
PDF
PostgreSQL Performance Tuning
elliando dias
 
PDF
[pgday.Seoul 2022] 서비스개편시 PostgreSQL 도입기 - 진소린 & 김태정
PgDay.Seoul
 
ODP
Base NoSql et Python
yboussard
 
PDF
MongodB Internals
Norberto Leite
 
PDF
PostgreSQL Deep Internal
EXEM
 
PPTX
Minio Cloud Storage
Minio
 
PPTX
Introduction to PostgreSQL
Joel Brewer
 
PPTX
Understanding and tuning WiredTiger, the new high performance database engine...
Ontico
 
PDF
[Pgday.Seoul 2018] 이기종 DB에서 PostgreSQL로의 Migration을 위한 DB2PG
PgDay.Seoul
 
PDF
[오픈소스컨설팅]Day #1 MySQL 엔진소개, 튜닝, 백업 및 복구, 업그레이드방법
Ji-Woong Choi
 
PDF
All you need to know about JavaScript loading and execution in the browser - ...
Caelum
 
PDF
MongoDB Performance Tuning
MongoDB
 
PPTX
mongodb와 mysql의 CRUD 연산의 성능 비교
Woo Yeong Choi
 
PPT
Content Storage With Apache Jackrabbit
Jukka Zitting
 
PPTX
Getting started with postgresql
botsplash.com
 
PDF
Angular server side rendering - Strategies & Technics
Eliran Eliassy
 
PDF
MySQL Space Management
MIJIN AN
 
MariaDB 마이그레이션 - 네오클로바
NeoClova
 
Spring Boot and REST API
07.pallav
 
MySQL_SQL_Tunning_v0.1.3.docx
NeoClova
 
PostgreSQL Performance Tuning
elliando dias
 
[pgday.Seoul 2022] 서비스개편시 PostgreSQL 도입기 - 진소린 & 김태정
PgDay.Seoul
 
Base NoSql et Python
yboussard
 
MongodB Internals
Norberto Leite
 
PostgreSQL Deep Internal
EXEM
 
Minio Cloud Storage
Minio
 
Introduction to PostgreSQL
Joel Brewer
 
Understanding and tuning WiredTiger, the new high performance database engine...
Ontico
 
[Pgday.Seoul 2018] 이기종 DB에서 PostgreSQL로의 Migration을 위한 DB2PG
PgDay.Seoul
 
[오픈소스컨설팅]Day #1 MySQL 엔진소개, 튜닝, 백업 및 복구, 업그레이드방법
Ji-Woong Choi
 
All you need to know about JavaScript loading and execution in the browser - ...
Caelum
 
MongoDB Performance Tuning
MongoDB
 
mongodb와 mysql의 CRUD 연산의 성능 비교
Woo Yeong Choi
 
Content Storage With Apache Jackrabbit
Jukka Zitting
 
Getting started with postgresql
botsplash.com
 
Angular server side rendering - Strategies & Technics
Eliran Eliassy
 
MySQL Space Management
MIJIN AN
 

Viewers also liked (20)

PDF
PHP UK 2017 - Don't Lose Sleep - Secure Your REST
Adam Englander
 
PDF
Driving Design through Examples
CiaranMcNulty
 
PDF
Hopping in clouds - phpuk 17
Michele Orselli
 
PPTX
Debugging Effectively - PHP UK 2017
Colin O'Dell
 
PDF
Drupal8 for Symfony Developers
Antonio Peric-Mazar
 
PDF
Enough suffering, fix your architecture!
Luís Cobucci
 
PDF
SunshinePHP 2017 - Making the most out of MySQL
Gabriela Ferrara
 
ODP
My app is secure... I think
Wim Godden
 
PPTX
Docker for Developers - Sunshine PHP
Chris Tankersley
 
PDF
WordPress for the modern PHP developer
Chris Sherry
 
PDF
Autenticação com Json Web Token (JWT)
Ivan Rosolen
 
PDF
Demystifying Object-Oriented Programming - PHP UK Conference 2017
Alena Holligan
 
PDF
Code Coverage for Total Security in Application Migrations
Dana Luther
 
PPTX
Debugging Effectively - SunshinePHP 2017
Colin O'Dell
 
PDF
Dip Your Toes in the Sea of Security
James Titcumb
 
PPTX
A World Without PHP
Ben Marks
 
PDF
Learn To Test Like A Grumpy Programmer - 3 hour workshop
chartjes
 
PDF
Integrating React.js with PHP projects
Ignacio Martín
 
PDF
Amp your site: An intro to accelerated mobile pages
Robert McFrazier
 
PDF
A recommendation engine for your php application
Michele Orselli
 
PHP UK 2017 - Don't Lose Sleep - Secure Your REST
Adam Englander
 
Driving Design through Examples
CiaranMcNulty
 
Hopping in clouds - phpuk 17
Michele Orselli
 
Debugging Effectively - PHP UK 2017
Colin O'Dell
 
Drupal8 for Symfony Developers
Antonio Peric-Mazar
 
Enough suffering, fix your architecture!
Luís Cobucci
 
SunshinePHP 2017 - Making the most out of MySQL
Gabriela Ferrara
 
My app is secure... I think
Wim Godden
 
Docker for Developers - Sunshine PHP
Chris Tankersley
 
WordPress for the modern PHP developer
Chris Sherry
 
Autenticação com Json Web Token (JWT)
Ivan Rosolen
 
Demystifying Object-Oriented Programming - PHP UK Conference 2017
Alena Holligan
 
Code Coverage for Total Security in Application Migrations
Dana Luther
 
Debugging Effectively - SunshinePHP 2017
Colin O'Dell
 
Dip Your Toes in the Sea of Security
James Titcumb
 
A World Without PHP
Ben Marks
 
Learn To Test Like A Grumpy Programmer - 3 hour workshop
chartjes
 
Integrating React.js with PHP projects
Ignacio Martín
 
Amp your site: An intro to accelerated mobile pages
Robert McFrazier
 
A recommendation engine for your php application
Michele Orselli
 
Ad

Similar to JWT - To authentication and beyond! (20)

PDF
I Don't Care About Security (And Neither Should You)
Joel Lord
 
PPTX
Microservice security with spring security 5.1,Oauth 2.0 and open id connect
Nilanjan Roy
 
PDF
I Don't Care About Security (And Neither Should You)
Joel Lord
 
PDF
Protecting Java Microservices: Best Practices and Strategies
Rodrigo Cândido da Silva
 
PDF
I Don't Care About Security
Joel Lord
 
PDF
Authentication and authorization in res tful infrastructures
Corley S.r.l.
 
PPTX
Token based-oauth2
andreyradzkov
 
PPT
Securing RESTful API
Muhammad Zbeedat
 
PPTX
MainFinalOAuth
Mohan Kumar Tadikimalla
 
PDF
CIS14: Developing with OAuth and OIDC Connect
CloudIDSummit
 
PDF
Securing APIs with OAuth 2.0
Kai Hofstetter
 
PDF
OAuth2
SPARK MEDIA
 
PPTX
Complete Guide to Setup Secure Scheme for Restful APIs
Xing (Xingheng) Wang
 
PPTX
An introduction to OAuth 2
Sanjoy Kumar Roy
 
PPTX
Building Secure User Interfaces With JWTs
robertjd
 
PPTX
Microservices Manchester: Authentication in Microservice Systems by David Borsos
OpenCredo
 
PPTX
Maintest 100713212237-phpapp02-100714080303-phpapp02
Mohan Kumar Tadikimalla
 
PPTX
Maintest 100713212237-phpapp02-100714080303-phpapp02
Mohan Kumar Tadikimalla
 
PPTX
OAuth2 para desarrolladores
Luis Ruiz Pavón
 
I Don't Care About Security (And Neither Should You)
Joel Lord
 
Microservice security with spring security 5.1,Oauth 2.0 and open id connect
Nilanjan Roy
 
I Don't Care About Security (And Neither Should You)
Joel Lord
 
Protecting Java Microservices: Best Practices and Strategies
Rodrigo Cândido da Silva
 
I Don't Care About Security
Joel Lord
 
Authentication and authorization in res tful infrastructures
Corley S.r.l.
 
Token based-oauth2
andreyradzkov
 
Securing RESTful API
Muhammad Zbeedat
 
MainFinalOAuth
Mohan Kumar Tadikimalla
 
CIS14: Developing with OAuth and OIDC Connect
CloudIDSummit
 
Securing APIs with OAuth 2.0
Kai Hofstetter
 
OAuth2
SPARK MEDIA
 
Complete Guide to Setup Secure Scheme for Restful APIs
Xing (Xingheng) Wang
 
An introduction to OAuth 2
Sanjoy Kumar Roy
 
Building Secure User Interfaces With JWTs
robertjd
 
Microservices Manchester: Authentication in Microservice Systems by David Borsos
OpenCredo
 
Maintest 100713212237-phpapp02-100714080303-phpapp02
Mohan Kumar Tadikimalla
 
Maintest 100713212237-phpapp02-100714080303-phpapp02
Mohan Kumar Tadikimalla
 
OAuth2 para desarrolladores
Luis Ruiz Pavón
 
Ad

Recently uploaded (20)

PDF
유니티에서 Burst Compiler+ThreadedJobs+SIMD 적용사례
Seongdae Kim
 
PDF
vMix Pro 28.0.0.42 Download vMix Registration key Bundle
kulindacore
 
PPTX
Engineering the Java Web Application (MVC)
abhishekoza1981
 
PDF
Streamline Contractor Lifecycle- TECH EHS Solution
TECH EHS Solution
 
PPTX
3uTools Full Crack Free Version Download [Latest] 2025
muhammadgurbazkhan
 
PPT
MergeSortfbsjbjsfk sdfik k
RafishaikIT02044
 
PDF
Capcut Pro Crack For PC Latest Version {Fully Unlocked} 2025
hashhshs786
 
PPTX
Tally software_Introduction_Presentation
AditiBansal54083
 
PDF
Mobile CMMS Solutions Empowering the Frontline Workforce
CryotosCMMSSoftware
 
PDF
GetOnCRM Speeds Up Agentforce 3 Deployment for Enterprise AI Wins.pdf
GetOnCRM Solutions
 
PPTX
Feb 2021 Cohesity first pitch presentation.pptx
enginsayin1
 
PDF
Salesforce CRM Services.VALiNTRY360
VALiNTRY360
 
PPTX
Agentic Automation Journey Session 1/5: Context Grounding and Autopilot for E...
klpathrudu
 
PDF
Digger Solo: Semantic search and maps for your local files
seanpedersen96
 
PDF
Revenue streams of the Wazirx clone script.pdf
aaronjeffray
 
PDF
Thread In Android-Mastering Concurrency for Responsive Apps.pdf
Nabin Dhakal
 
PPTX
Platform for Enterprise Solution - Java EE5
abhishekoza1981
 
PDF
Understanding the Need for Systemic Change in Open Source Through Intersectio...
Imma Valls Bernaus
 
PPTX
A Complete Guide to Salesforce SMS Integrations Build Scalable Messaging With...
360 SMS APP
 
PPTX
Why Businesses Are Switching to Open Source Alternatives to Crystal Reports.pptx
Varsha Nayak
 
유니티에서 Burst Compiler+ThreadedJobs+SIMD 적용사례
Seongdae Kim
 
vMix Pro 28.0.0.42 Download vMix Registration key Bundle
kulindacore
 
Engineering the Java Web Application (MVC)
abhishekoza1981
 
Streamline Contractor Lifecycle- TECH EHS Solution
TECH EHS Solution
 
3uTools Full Crack Free Version Download [Latest] 2025
muhammadgurbazkhan
 
MergeSortfbsjbjsfk sdfik k
RafishaikIT02044
 
Capcut Pro Crack For PC Latest Version {Fully Unlocked} 2025
hashhshs786
 
Tally software_Introduction_Presentation
AditiBansal54083
 
Mobile CMMS Solutions Empowering the Frontline Workforce
CryotosCMMSSoftware
 
GetOnCRM Speeds Up Agentforce 3 Deployment for Enterprise AI Wins.pdf
GetOnCRM Solutions
 
Feb 2021 Cohesity first pitch presentation.pptx
enginsayin1
 
Salesforce CRM Services.VALiNTRY360
VALiNTRY360
 
Agentic Automation Journey Session 1/5: Context Grounding and Autopilot for E...
klpathrudu
 
Digger Solo: Semantic search and maps for your local files
seanpedersen96
 
Revenue streams of the Wazirx clone script.pdf
aaronjeffray
 
Thread In Android-Mastering Concurrency for Responsive Apps.pdf
Nabin Dhakal
 
Platform for Enterprise Solution - Java EE5
abhishekoza1981
 
Understanding the Need for Systemic Change in Open Source Through Intersectio...
Imma Valls Bernaus
 
A Complete Guide to Salesforce SMS Integrations Build Scalable Messaging With...
360 SMS APP
 
Why Businesses Are Switching to Open Source Alternatives to Crystal Reports.pptx
Varsha Nayak
 

JWT - To authentication and beyond!