4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

42
REST w praktyce ...tej dobrej i tej złej Jakub Kubrynski [email protected] / @jkubrynski 1 / 42

Transcript of 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

Page 1: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

REST w praktyce...tej dobrej i tej złej

Jakub Kubrynski

[email protected] / @jkubrynski 1 / 42

Page 2: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

[email protected] / @jkubrynski 2 / 42

Page 3: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

"The Code is more what you'd call guidelines than actual rules. Welcomeaboard the Black Pearl, Miss Turner"

-- Cpt. Hector Barbossa to Elizabeth Swann

RT Ben Hale

[email protected] / @jkubrynski 3 / 42

Page 4: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

Formal REST constraintsClient-Server

Stateless

Cache

Interface / Uniform Contract

Layered System

[email protected] / @jkubrynski 4 / 42

Page 5: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

Richardson maturity model

http://martinfowler.com/articles/richardsonMaturityModel.html

[email protected] / @jkubrynski 5 / 42

Page 6: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

POST vs PUT

[email protected] / @jkubrynski 6 / 42

Page 7: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

POST vs PUTPOST creates new resources

[email protected] / @jkubrynski 7 / 42

Page 8: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

POST vs PUTPOST creates new resources

PUT updates existing resources

PUT can create resource if ID is already known

[email protected] / @jkubrynski 8 / 42

Page 9: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

REST without PUTsfor everyone who hates CRUD

[email protected] / @jkubrynski 9 / 42

Page 10: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

REST without PUTsfor everyone who hates CRUD

all changes driven by events

POST to /domainEvents

[email protected] / @jkubrynski 10 / 42

Page 11: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

Maybe PATCH?partial update concept

no "out of the box" support

[email protected] / @jkubrynski 11 / 42

Page 12: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

Cachingbe aware - especially IE caches aggressively

better disable caching

[email protected] / @jkubrynski 12 / 42

Page 13: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

Cache headerscache-control: public, max-age=0, no-cache

public / private

no-cacheno-storemax-ages-maxage

[email protected] / @jkubrynski 13 / 42

Page 14: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

ETagIf-None-Match header set to entity uuid

if matches then "304 Not Modified"

uuid can be smart - entity id and version

"User:34652:15"

[email protected] / @jkubrynski 14 / 42

Page 15: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

Compressionreduces response size dramatically

10 times smaller response is nothing special

usually really easy to enable

[email protected] / @jkubrynski 15 / 42

Page 16: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

HATEOAS

[email protected] / @jkubrynski 16 / 42

Page 17: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

HATEOASself-descriptive

[email protected] / @jkubrynski 17 / 42

Page 18: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

HATEOASself-descriptive

client understands hypermedia

{ "name" : "Alice", "email" : "alice_at_inchains.org" "links" : [ { "rel" : "self", "href" : "/customers/1213" }, { "rel" : "currentOrder", "href" : "/orders/14312" }, { "rel" : "loyaltyAccount", "href" : "/accounts/11234" } ]}

HTTP/1.1 201 CreatedLocation: http://api.myshop.com/orders/1234

[email protected] / @jkubrynski 18 / 42

Page 19: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

@DanaDanger HTTP codes classification20x: cool

30x: ask that dude over there

40x: you fucked up

50x: we fucked up

[email protected] / @jkubrynski 19 / 42

Page 20: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

Exceptionshide sensitive information

[email protected] / @jkubrynski 20 / 42

Page 21: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

Exceptionshide sensitive information

but include detailed information

{ "status" : 400, "code" : 40483, "message" : "Incorrect body signature", "moreInfo" : "http://www.mycompany.com/errors/40483"}

[email protected] / @jkubrynski 21 / 42

Page 22: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

API Versioningdon't even think aboutapi.domain.com/v2/orders

URIs to the same resources should be fixedbetween versions

[email protected] / @jkubrynski 22 / 42

Page 23: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

API Versioningdon't even think aboutapi.domain.com/v2/orders

URIs to the same resources should be fixedbetween versions

use Content-Type

1 version: application/vnd.domain+json

2 version: application/vnd.domain.v2+json

[email protected] / @jkubrynski 23 / 42

Page 24: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

Filtering and sortingGET /reviews?rating=5

GET /reviews?rating=5&sortAsc=author

[email protected] / @jkubrynski 24 / 42

Page 25: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

Filtering and sortingGET /reviews?rating=5

GET /reviews?rating=5&sortAsc=author

Dynamic queries are easier in POST body

[email protected] / @jkubrynski 25 / 42

Page 26: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

Filtering and sortingGET /reviews?rating=5

GET /reviews?rating=5&sortAsc=author

Dynamic queries are easier in POST body

POST /reviews/searches

GET /reviews/searches/23?page=2

[email protected] / @jkubrynski 26 / 42

Page 27: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

Documentationrunnable with examples

Swagger

[email protected] / @jkubrynski 27 / 42

Page 28: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

[email protected] / @jkubrynski 28 / 42

Page 29: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

Stateless or not?password hashing cost

session replication

load-balancing

[email protected] / @jkubrynski 29 / 42

Page 30: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

Stateless or not?password hashing cost

session replication

load-balancing

...

stateless session?

[email protected] / @jkubrynski 30 / 42

Page 31: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

SecuritySQL Injection

XSS

CSRF

XXE

[email protected] / @jkubrynski 31 / 42

Page 32: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

CSRF - Cross-site request forgery<img src="https://api.mybank.com/transfers/from/1233/to/1234/amount/5000">

<form action="https://api.mybank.com/transfers" method="POST"> <input type="hidden" name="from" value="1233"/> <input type="hidden" name="to" value="1234"/> <input type="hidden" name=amount" value="5000"/> <input type="submit" value="Celebrity Nude Photos!"/></form>

[email protected] / @jkubrynski 32 / 42

Page 33: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

CSRF - Cross-site request forgery<img src="https://api.mybank.com/transfers/from/1233/to/1234/amount/5000">

<form action="https://api.mybank.com/transfers" method="POST"> <input type="hidden" name="from" value="1233"/> <input type="hidden" name="to" value="1234"/> <input type="hidden" name=amount" value="5000"/> <input type="submit" value="Celebrity Nude Photos!"/></form>

One time request tokens

Correct CORS headers

[email protected] / @jkubrynski 33 / 42

Page 34: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

CORS - Cross Origin Requests SharingPreflight request

OPTIONS /cors HTTP/1.1Origin: http://www.domain.comAccess-Control-Request-Method: PUTAccess-Control-Request-Headers: X-Custom-HeaderHost: api.mydomain.orgAccept-Language: en-USConnection: keep-aliveUser-Agent: Mozilla/5.0...

Preflight response

Access-Control-Allow-Origin: http://www.domain.comAccess-Control-Allow-Methods: GET, POST, PUTAccess-Control-Allow-Headers: X-Custom-HeaderContent-Type: text/html; charset=utf-8

[email protected] / @jkubrynski 34 / 42

Page 35: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

XML External Entity<?xml version="1.0" encoding="utf-8"?><comment> <text>Yeah! I like it!</text></comment>

[email protected] / @jkubrynski 35 / 42

Page 36: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

XML External Entity<?xml version="1.0" encoding="utf-8"?><comment> <text>Yeah! I like it!</text></comment>

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE myentity [ <!ENTITY a "Yeah! I like it!"> ]><comment> <text>&a;</text></comment>

[email protected] / @jkubrynski 36 / 42

Page 37: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

# XML External Entity

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE myentity [ <!ENTITY a SYSTEM "/etc/passwd"> ]><comment> <text>&a;</text></comment>

[email protected] / @jkubrynski 37 / 42

Page 38: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

# XML External Entity

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE myentity [ <!ENTITY a SYSTEM "/etc/passwd"> ]><comment> <text>&a;</text></comment>

<?xml version="1.0" encoding="utf-8"?><comment> <text>root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt ..... </text></comment>

[email protected] / @jkubrynski 38 / 42

Page 39: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

XML External Entity<?xml version="1.0" encoding="utf-8"?><!DOCTYPE myentity [<!ENTITY a "abcdefghij1234567890" ><!ENTITY b "&a;&a;&a;&a;&a;&a;&a;&a;&a;&a" ><!ENTITY c "&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;" ><!ENTITY d "&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;" >...<!ENTITY h "&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;" >]><comment> <text>&h;</text></comment>

[email protected] / @jkubrynski 39 / 42

Page 40: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

 

http://knowyourmeme.com/photos/531557 thx to @mihn

[email protected] / @jkubrynski 40 / 42

Page 41: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

DDD training?

[email protected] / @jkubrynski 41 / 42

Page 42: 4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński

Thanks!

[email protected] / @jkubrynski 42 / 42