Web – services Andrea Manconi IASC group DIEE – Departement of Eletrical and Eletronic Engineering [email protected] Sommario Web services Web application (CGI, FastCGI, ASP, JSP,PHP) Servlet vs CGI, FastCGI, ASP, JSP,PHP Servlet – persistenza Servlet – caching Servlet – contenuto HTML Servlet – sessioni Servlet – sicurezza Distribuzione di carico Andrea Manconi Web service Web service Per web service si intende un servizio offerto attraverso il web. Esempio: richiesta informazioni prodotto catalogo. Si invia una richiesta ad un dato URL e il servizio risponde fornendo le informazioni richieste. Andrea Manconi Web service Web page: statica. Non esiste iterazione Web application: dinamica. Iterazione con l’utente Andrea Manconi Web application Web application CGI FastCGI ASP JSP PHP Java Servlet Andrea Manconi Web application - CGI Common Gateway Interface Una delle prime tecnologie utilizzate Nata per definire un metodo standard per la comunicazione tra un server di informazioni e applicazioni esterne Ciclo di vita: pessimo, un nuovo processo per ogni richiesta (tempo e risorse del server) Andrea Manconi Web application - CGI Vantaggi Semplice da scrivere Portabilità Supporta molti linguaggi: es. C, Perl Andrea Manconi Web application - CGI Svantaggi Prestazioni limitate Impossibilità di interazione con il server web a causa dei processi separati (es. non è possibile scrivere sul file log del server) Andrea Manconi Web application - CGI HelloWorld.cgi (Perl) #!/usr/bin/perl $t = "Hello World!"; print <<EOT; Content-type: text/html <Title> $t </Title> <H1> $t </H1> EOT Andrea Manconi Web application - FastCGI FastCGI Sviluppata da Open Market Elimina la necessità di creare un nuovo processo per ogni richiesta pervenuta Tuttavia è necessario attivare almeno un processo per ogni programma FastCGI Andrea Manconi Web application - FastCGI Vantaggi Semplice Facile migrare da applicazioni applicazioni FastCGI Alte performance (rispetto a CGI) Molti linguaggi supportati Andrea Manconi CGI ad Web application - FastCGI Svantaggi è necessario attivare almeno un processo per ogni programma FastCGI, se un programma FastCGI deve gestire richieste concorrenti saranno attivati più processi continua a mancare l’interazione con il server Andrea Manconi Web application - ASP Active Server Pages Sviluppato da Microsoft Pagina HTML con codice incorporato (in genere VBScript e JScript) Problema: in piattaforma non Windows potrebbero sorgere problemi legati all’assenza della libreria COM di Windows Andrea Manconi Web application - ASP Vantaggi Facile da usare Ottimizzato per piccoli contenuti dinamici Andrea Manconi Web application - ASP Svantaggi Portabilità: 1) il supporto ASP è contenuto in Microsoft Internet Information Server 3.0, disponibile gratuitamente, mentre il supporto per altri server web è disponibile come prodotto commerciale 2) su piattaforme non Windows problemi legati all’assenza della libreria COM Andrea Manconi Web application - ASP HelloWorld.asp <HTML> <BODY> <% For i = 3 To 7 %> <FONT SIZE="<% = i %>">Hello World! <BR> <% Next %> </BODY> </HTML> Andrea Manconi Web application - ASP Hello World! Hello World! Hello World! Hello World! Hello World! Andrea Manconi Web application - JSP Java Server Pages Alternativa ad ASP basata su Java Sviluppata da SUN Forte legame con le servlet Andrea Manconi Web application - JSP Vantaggi Standard: implementato da moltissimi produttori su tutte le piattaforme Semplice passare da ASP a JSP per chi conosce JAVA Andrea Manconi Web application - JSP Svantaggi Un solo linguaggio di script: JAVA Ottimizzato per piccoli contenuti dinamici Andrea Manconi Web application - JSP HelloWorld.jsp <HTML> <BODY> Hello World! The time is now <%=new java.util.Date() %> </BODY> </HTML> Andrea Manconi Web application - PHP È un linguaggio di scripting open-source per la creazione di contenuti dinamici Il codice PHP viene scritto come codice embedded all’interno delle pagine HTML Andrea Manconi Web application - PHP HelloWorld.php /* void echo ( string arg1 [, string argn...]) */ _________________________________________ <html> <head> <title>Test PHP</title> </head> <body> <?php echo "Hello World!<p>"; ?> </body> </html> Andrea Manconi Web application - PHP Interfaccia verso i più comuni database (oracle, MySQL …) Sintassi simile a quella del C e di Perl Cross-platform compatibility: significa che gli script PHP sono supportati da tutti gli Internet servers Andrea Manconi Web application - PHP Vantaggi: Open – source !!! Non è proprietario, e quindi non è ristretto a determinate piattaforme Facile da utilizzare Andrea Manconi Web application - PHP Svantaggi Forte consumo di memoria da parte dell’interprete (variabili non necessariamente dichiarate) Andrea Manconi Web application - Servlet Servlet E’ pensabile come ad una estensione che è possibile collegare ad un server al fine di migliorarne ed estenderne le funzionalità. L’esecuzione avviene all’interno di una JVM e pertanto è sicura e portabile Andrea Manconi Web application - Servlet Tutte le servlet vengono gestite da thread separati all’interno dello stesso processo Portabilità: sia rispetto ai sistemi operativi, sia verso i server web Andrea Manconi Web application - Servlet Le servlet operano all’interno del dominio del server, pertanto a differenza delle applet non richiedono che il browser supporti JAVA Andrea Manconi Servlet vs CGI Servlet sono una soluzione Sun alle CGI Entrambi generano contenuti dinamici Le Servlet sono sicure Le Servlet sono indipendenti dalla piattaforma Le Servlet hanno un migliore supporto per i componenti riusabili Andrea Manconi Servlet vs CGI Servlet: vantaggi associate a thread del web server, non a processi separati Servlet: svantaggi Possono essere scritte esclusivamente in Java Andrea Manconi Servlet vs CGI L’esecuzione di una CGI è indipendente dalle altre. La comunicazione tra diverse istanze è complessa Una servlet è sempre in esecuzione e la comunicazione tra i vari thread è semplificata Un processo per ogni richiesta. Ad n richieste n copie dell’applicazione in memoria Andrea Manconi Servlet vs CGI Servlet CGI Scripts Creazione Media Media Efficienza di esecuzione Indipendenza dalla piattaforma Alta Bassa Molto alta Media Andrea Manconi Servlet vs FastCGI Servlet: gestione semplificata delle sessioni FastCGI: possibilità di scelta tra più linguaggi Servlet: PORTABILITA’ Andrea Manconi Servlet vs ASP Le Servlet sono portabili verso altri sistemi operativi web server Le Servlet sono più potenti per applicazioni complesse Migliore supporto per componenti riusabili Andrea Manconi Servlet vs JSP Esiste una forte relazione tra le servlet e JSP Servlet: codice JAVA che legge e scrive HTML JSP: HTML con codice JAVA embedded Andrea Manconi Servlet vs PHP Java è ottimo per progetti complessi Librerie PHP utilizza i cookie ma non ha una gestione delle sessioni Andrea Manconi Web server WebSphere (IBM) WebLogic (BEA) www.allaire.com/products/jrun Sun Java Web Server http://www.oracle.com/ip/deploy/ias/ Jrun (Allaire) http://www.bea.com 9i Application Server (Oracle) http://www-3.ibm.com/software/info1/websphere/index.jsp www.sun.com/software/jwebserver/try Tomcat (Apache) http://jakarta.apache.org Andrea Manconi Servlet J2EE J2EE raccoglie diverse API lato server Servlet API JSP EJB JavaMail JMS (Java Messaging Service) JTA (Java Transactions) Corba JDBC JAXP (Java API for XML Parsing) JNDI (Java Naming and Directory Interface) Andrea Manconi Persistenza Persistenza Nel momento in cui il codice di una servlet viene caricato, il server crea una singola istanza, per gestire tutte le richieste. Andrea Manconi Persistenza Vantaggi: Ridotto consumo di memoria Riduzione del carico di lavoro, altrimenti necessario per creare un nuovo oggetto ad ogni richiesta Permette la persistenza Andrea Manconi Persistenza Cosa si intende per persistenza ? Le web application fanno in genere riferimento ad un db. Si immagini cosa significa stabilire una connessione al db per ogni richiesta che viene effettuata. È evidente il vantaggio della persistenza della connessione con una singolo istanza della servlet che gestisce la connessione. Andrea Manconi Persistenza import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class SimpleCounter extends HttpServlet { int count = 0; public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/plain"); PrintWriter out = res.getWriter(); count++; out.println(“Numero di accessi: " + count); } } Andrea Manconi Persistenza Problema: se si utilizzano variabili locali non esistono problemi di interazione tra i thread, ma se si utilizzano variabili non locali … Andrea Manconi Persistenza Si consideri contatore mostrato in precedenza, cosa accade se due utenti accedono alla servlet quasi contemporaneamente ? Entrambi i thread saranno colpevoli di incrementare lo stesso valore del contatore, mostrando a video lo stesso risultato. Andrea Manconi Persistenza Il problema è dovuto alla necessità di sincronizzare l’utilizzo della variabile count, in modo che un thread alla volta possa operare su essa. In java questo viene fatto utilizzando la parola chiave synchronized Andrea Manconi Persistenza Possibili soluzioni: public syncronized void doGet(HttpServletRequest req, HttpServletResponse res) … Andrea Manconi Persistenza Un’altra soluzione … PrintWriter out = res.getWriter(); syncronized(this) { count++; out.println(“Numero di accessi” + count); } Andrea Manconi Persistenza Problematiche legate: L’utilizzo della sincronizzazione (monitor) implica un carico elevato Nel periodo in cui un thread esegue un blocco syncronized gli altri thread possono essere bloccati in attesa del rilascio delle risorse !!! Andrea Manconi Persistenza Altre problematiche: cosa accade se il server “cade”, oppure se per qualche motivo è necessario ricaricare la servlet ? Andrea Manconi Persistenza … il contatore inizia a contare da zero Andrea Manconi Persistenza Metodi init() e destroy() il metodo init() definisce le operazioni di inizializzazione della servlet, quelle che devono essere effettuate al momento del suo caricamento, mentre il metodo destroy() implementa le operazioni per la distruzione della servlet. Andrea Manconi Persistenza Con l’utilizzo di questi due metodi, il problema del contatore può essere risolto facilmente interfacciandoci con un db o con l’utilizzo di un file. init(): inizializzazione del contatore a zero al primo accesso in assoluto o lettura del suo valore da file o db destroy(): memorizzazione del nuovo valore del contatore Andrea Manconi Persistenza Singolo thread Esiste la possibilità di caricare per una servlet un pool di istanze. Non tutti i server permettono di fare questo. È necessario che la servlet implementi l’interfaccia javax.servlet.SingleThreadModel (è un’interfaccia vuota !!!) Andrea Manconi Caching Caching Molti browser per ridurre il tempo di acceso ad una pagina web accedono alla loro copia in cache. Dal punto di vista delle web-application questo “vantaggio” può essere un grosso problema !!! Infatti si scontra con l’histrory del client. Andrea Manconi Caching Si pensi ad un sistema di e-commerce in cui esistono due pagine, una pagina che mostra il carrello e una pagina dei prodotti in catalogo. Se ogni volta che l’utente carica un nuovo prodotto nel carrello il browser ricarica la sua copia nella cache della pagina che mostra il carrello, invece di inoltrare la richiesta al web server, l’utente non avrà visione di quello che decide di acquistare Andrea Manconi Caching La maggior parte dei server web, restituisce, ad ogni richiesta, un intestazione LastModified : Sun, 07-Jul-1974 01:10:00 GMT Lato browser web, viene inclusa nella propria richiesta un’intestazione identica IfModifiedSince. Andrea Manconi Caching Dallo scambio di queste informazioni il server decide se re-inviare una pagina più recente oppure no. In quest’ultimo caso: codice di stato 304 Not Modified Andrea Manconi Caching Nel caso di contenuto dinamico (servlet) è cosa buona e giusta che il server assuma che il contenuto cambi in continuazione. Questo implica lo svantaggio di dovere effettivamente ricaricare le pagine dinamiche lato client, e carico di lavoro lato server, ma previene da eventuali malfunzionamenti !!! Andrea Manconi Caching Per impostare il ricaricamento delle pagine, la servlet può implementare il metodo protected long getLastModified(HttpServletRequest) Il server interroga questo metodo per scoprire quando è stata l’ultima volta che la servlet ha modificato il suo output. Andrea Manconi Contenuto HTML Contenuto HTML Principalmente una servlet scrive codice HTML dinamico. Una servlet contiene “HTML embedded” !!! Andrea Manconi Contenuto HTML private void privateArea ( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ String sqlCommand; PrintWriter out = response.getWriter(); try{ sqlCommand = "SELECT * FROM shop ORDER BY shopid"; acs.rs = acs.stmt.executeQuery(sqlCommand); out.println("<HTML"+ "<HEAD><TITLE>Comune di Sestu - E-commerce - Sestu 2010</TITLE></HEAD>\n"+ "<BODY bgcolor='#FFFFFF' text='#666666' link='#3366FF' vlink='#CCCCCC'ALINK='#666666'>\n"+ "<FONT FACE='VERDANA' size=+1>\n"+ "<TABLE ALIGN='CENTER' BORDER='0'>\n"+ "<TR>\n"+ "<TD ALIGN='CENTER' COLSPAN='2'>\n"+ "<FONT SIZE=+2> Area Privata. Solo autorizzati\n"+ "</TD>\n"+ "</TR>\n"+ Andrea Manconi Acquisire contenuto dai form In una web application spesso risulta necessario acquisire informazioni dall’utente. Si pensi al classico servizio di registrazione utente. Andrea Manconi Acquisire contenuto dai form "<FORM METHOD=POST ACTION="+response.encodeURL("/IndexServlet/CustomerServlet?registercustomer=")+">\n"+ "<TABLE BORDER='0' cellspacing='0' cellpadding='1' BGCOLOR='#4A7B99' ALIGN='CENTER'>\n"+ "<TR>\n"+ "<TD ALIGN='CENTER' COLSPAN='2' BGCOLOR='#CCCCCC'><FONT SIZE='4' COLOR='#4A7B99'>Compila il modulo di registrazione</FONT></TD>\n"+ "</TR>\n"+ "<TR>\n"+ "<TD ALIGN='RIGHT'><FONT COLOR='#E78A27'>User name:</FONT></TD><TD> <INPUT TYPE="+"text"+ "name="+"userid"+" MAXLENGTH="+"10"+"></TD>\n"+ "</TR>\n"+ "<TR>\n"+ "<TD ALIGN='RIGHT'><FONT COLOR='#E78A27'>Password:</FONT></TD><TD> <INPUT TYPE="+"password"+ "name="+"newpswid"+"></TD>\n"+ "</TR>\n"+ "<TR>\n"+ "<TD ALIGN='RIGHT'><FONT COLOR='#E78A27'>Ridigitare la password:</FONT></TD><TD> <INPUT TYPE="+"password"+ " name="+"newpswid2"+"></TD>\n"+ "</TR>\n"+ "<TR>\n"+ "<TD ALIGN='RIGHT'><FONT COLOR='#E78A27'>Nome:</FONT></TD><TD> <INPUT TYPE="+"text"+ " name="+"firstname"+"></TD>\n"+ "</TR>\n"+ "<TR>\n"+ Andrea Manconi Acquisire contenuto dai form public String getParameter(String name) il metodo permette di acquisire i valori associati al campo del form individuato dal parametro “name”. Il metodo è definito dall’interfaccia javax.servlet.ServletRequest ed è ereditato da javax.servlet.HttpServletRequest Andrea Manconi Acquisire contenuto dai form sqlCommand = "INSERT INTO custinfo VALUES “+ "('"+request.getParameter("userid")+ "',MD5('"+request.getParameter("newpswid")+"'), '“+request.getParameter("firstname")+"'"+ Andrea Manconi Session tracking Session tracking HTTP: è stateless, cioè non permette la memorizzazione di una sequenza di richieste, o meglio non permette di associare questa sequenza ad un dato utente. Andrea Manconi Session tracking Esempio: si pensi all’applicazione ecommerce. E’ necessario memorizzare lo stato per “ricordare” l’history dell’utente !!!! Andrea Manconi Session tracking Autenticazione utente: processo che porta a riconoscere un client tramite user name e una password, con l’aiuto del metodo String getRemoteUser() metodo definito nella classe HttpServletRequest E’ possibile dare l’accesso ad alcune risorse solo a utenti identificati da user name e password noti. Andrea Manconi Session tracking Vantaggi Facile da realizzare Indipendente dalla macchina dalla quale si connette Svantaggi Registrazione obbligatoria Login obbligatorio Logout solo disconnettendosi dal browser Andrea Manconi Session tracking Cookie: è un’informazione inviata al browser da un server web. Quando riceve un cookie lo salva e poi lo rinvia al server ogni volta che accede a una pagina su di esso. Andrea Manconi Session tracking Un cookie ha un nome, un valore, e alcuni attributi facoltativi come una descrizione, una data di scadenza, un numero di versione e così via. Andrea Manconi Session tracking I cookie vengono ritrasmessi verso il server HTTP ogni volta che: il cookie non è scaduto il dominio che interroghiamo è il dominio di persistenza del cookie Andrea Manconi Session tracking Limitazioni: i browser accettano 20 cookie per sito 300 cookie per utente 4096 byte per cookie Andrea Manconi Session tracking Le servlet API definiscono la classe javax.servlet.http.Cookie per la gestione dei cookie Una servlet recupera tutti i cookie che ha inviato attraverso il metodo public Cookie[] HttpServletRequest.getCookies() Andrea Manconi Session tracking Per default i cookie sono restituiti solo all’host che li ha salvati È possibile impostare la scadenza per un cookie utilizzando il metodo public void Cookie.setMaxAge(int expiry) Andrea Manconi Session tracking Vantaggi Anonimo e trasparente Svantaggi Fortemente legato alla macchina, i cookie sono memorizzati su disco !!! Il browser può non supportare i cookie Andrea Manconi Session tracking Servlet Session Tracking Quando un utente accede ad una web application gli viene assegnato un ID unico di sessione L’ID di sessione viene salvato sul client in un cookie chiamato JSESSIONID. Se il client non supporta i cookie, l’ID di sessione viene inviato come parte di un URL modificato. La session può essere invalidata con la chiusura del browser o impostando un timeout per la sessione. Andrea Manconi Session tracking Un’HttpSession è ottenibile tramite la HttpServletRequest public void doPost(HttpServletRequest req,HttpServletResponse res) { …. HttpSession session = req.getSession(true); } Andrea Manconi Session tracking Per la gestione degli oggetti public voi setAttribute(String name, Object value) public Object getAttribute(String name) public void removeAttribute(String name) Andrea Manconi Sicurezza Sicurezza Autenticazione: identificare il client Autorizzazione: limitare l’accesso alle risorse ad un insieme selezionato di utenti Riservatezza: garanzia che soltanto le parti coinvolte possano comprendere la comunicazione Integrità: garantire che il contenuto della comunicazione non è mutato durante la trasmissione Andrea Manconi Sicurezza Autenticazione HTTP: detta autenticazione di base. Basato su un semplice modello challenge/response – username/password. Il server web mantiene un database di username e password e identifica quali risorse devono essere protette tramite il meccanismo di autenticazione utente. Andrea Manconi Sicurezza – Autenticazione HTTP Codifica Base64 per la trasmissione delle password (facilmente reversibile) Password scritte in chiaro sul server Andrea Manconi Sicurezza – Autenticazione HTTP <?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE web-app (View Source for full doctype...)> <web-app> <servlet> <servlet-name>secret</servlet-name> <servlet-class>SalaryServer</servlet-class> </servlet> <security-constraint> <web-resource-collection> <web-resource-name>SecretProtection</web-resource-name> <url-pattern>/servlet/SalaryServer</url-pattern> <url-pattern>/servlet/secret</url-pattern> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection> Andrea Manconi Sicurezza – Autenticazione HTTP <auth-constraint> <role-name>manager</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method> BASIC <!-- BASIC, DIGEST, FORM, CLIENT-CERT --> </auth-method> <realm-name> Default <!-- optional, only useful for BASIC --> </realm-name> </login-config> <security-role> <role-name>manager</role-name> </security-role> </web-app> Andrea Manconi Sicurezza – Autenticazione HTTP <security-constraint> protegge un elemento <web-resource-collection> in modo da consentire l’accesso solo ai ruoli indicati da <authconstraint>. Se non è specificata alcuna voce <http-method> vengono protetti tutti i metodi HTTP. La metodologia di autenticazione è specificata da <auth-method>. Andrea Manconi Sicurezza – Autenticazione HTTP Il file utilizzato per l’autenticazione HTTP (con tomcat web server tomcat-users.xml) <tomcat-users> <user name="Dilbert" password="dnrc" roles="engineer" /> <user name="Wally" password="iluvalice“ roles="engineer,slacker" /> <user name="MrPointyHair" password="MrPointyHair" roles="manager,slacker" /> </tomcat-users> Andrea Manconi Sicurezza – Autenticazione HTTP Recupero parametri di autenticazione public String HttpServletRequest.getRemoteUser() /* restituisce il nome dell’utente che effettua la richiesta */ public String HttpServletRequest.getAuthType() /* restituisce il tipo di autorizzazione usata */ public boolean HttpServletRequest.isUserInRole(String role) /* restituisce true solo se l’utente autenticato appartiene al ruolo specificato */ Andrea Manconi Sicurezza – Autenticazione basata su modulo A differenza della autenticazione base, permette di entrare nel sito con una pagina di login documentata. Come per l’autenticazione base anche in questo caso le password sono in chiaro sul server e facilmente individuabili. Andrea Manconi Sicurezza – Autenticazione basata su modulo Vengono impostate due pagine HTML, una per il login corretto e una pagina di errore. Le pagine sono indicate nel web.xml Andrea Manconi Sicurezza – Autenticazione basata su modulo <?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE web-app (View Source for full doctype...)> <web-app> <servlet> <servlet-name>secret</servlet-name> <servlet-class>SalaryServer</servlet-class> </servlet> <security-constraint> <web-resource-collection> <web-resource-name>SecretProtection</web-resource-name> <url-pattern>/servlet/SalaryServer</url-pattern> <url-pattern>/servlet/secret</url-pattern> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection> Andrea Manconi Sicurezza – Autenticazione basata su modulo <auth-constraint> <role-name>manager</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method> FORM <!-- BASIC, DIGEST, FORM, CLIENT-CERT --> </auth-method> <form-login-config> <!-- only useful for FORM --> <form-login-page>/loginpage.html</form-login-page> <form-error-page>/errorpage.html</form-error-page> </form-login-config> </login-config> <security-role> <role-name>manager</role-name> </security-role> </web-app> Andrea Manconi Sicurezza – Autenticazione personalizzata Sfrutta l’autenticazione HTTP Potenzialità: gestione all’accesso di una servlet (user/password) gestione all’accesso di una risorsa in base alla nazione di appartenenza (vedi embargo) gestione dell’accesso ad una risorsa in base all’IP Andrea Manconi Sicurezza – Autenticazione personalizzata L’autenticazione personalizzata fa in genere riferimento a password memorizzate in scuro su file o database. In questo caso si aggiungono altri livelli di sicurezza, quello del database, protetto da password, e inoltre si possono utilizzare altri algoritmi di codifica per le passoword utente come l’MD5 Andrea Manconi Sicurezza – Autenticazione personalizzata L’MD5 è un algoritmo di codifica a 128 bit. In java può essere utilizzato con l’ausilio del package java.security Andrea Manconi Sicurezza – Autenticazione personalizzata Molti database, supportano l’MD5 come istruzione da linea di commando. Il vantaggio è quello di eliminare la necessità di scrivere codice JAVA aggiuntivo, alleggerendo il lavoro. Andrea Manconi Sicurezza – Autenticazione personalizzata Una servlet utilizza i codici di stato HTTP per gestire il proprio criterio di protezione. Per fare questo utilizza le credenziali dell’utente codificate nell’intestazione Authorization. Nel caso le credenziali vengano rifiutate la servlet imposta l’invio del codice di stato SC_UNAUTHORIZED e un’intestazione WWW-Authenticate che descrive le credenziali desiderate. Andrea Manconi Sicurezza – Autenticazione personalizzata public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/plain"); PrintWriter out = res.getWriter(); // Imposta l’header Authorization String auth = req.getHeader("Authorization"); } // richiama un metodo che si interfaccia con un db per valutare l’autenticazione if (!allowUser(auth)) { // Accesso non permesso, notifica res.setHeader("WWW-Authenticate", "BASIC realm=\"users\""); res.sendError(res.SC_UNAUTHORIZED); } else { // Accesso permesso out.println(“link to diee www.diee.unica.it "); } Andrea Manconi Sicurezza: Certificati Digitali I certificati digitali offrono un livello di sicurezza superiore Chiave asimmetrica: esistono due chiavi Privata Pubblica Andrea Manconi Sicurezza: Certificati Digitali Esempio: si consideri il caso in cui due utenti debbano scambiarsi dei messaggi. Identifichiamo i due utenti come A e B Andrea Manconi Sicurezza: Certificati Digitali A codifica il messaggio che deve inviare con la chiave pubblica di B B decodifica il messaggio che ha inviato A con la sua chiave privata Questo sistema di chiavi è detto asimmetrico perché ogni chiave può decodificare i messaggi codificati con l’altra chiave Andrea Manconi Sicurezza: Certificati Digitali Problema: questo sistema non risolve il problema dell’autenticazione. L’utente B non ha alcuna certezza che il messaggio che ha ricevuto è stato inviato da A o da un terzo utente C sotto mentite spoglie !!! Andrea Manconi Sicurezza: Certificati Digitali Per risolvere il problema si sfrutta l’asimmetria delle chiavi come segue: A codifica l’informazione con la sua chiave privata, e poi ancora con la chiave pubblica di B B decodifica l’informazione con la sua chiave privata e poi con la chiave pubblica di A, che deve possedere Andrea Manconi Sicurezza: Certificati Digitali Visto che solo A può codificare i messaggi con la sua chiave privata, l’autenticazione è garantita …. tuttavia permane ancora un problema. La certificazione dell’identità. Cioè come può un utente garantire che è chi dice di essere ? A questo proposito intervengono le autorità di certificazione (es VeriSign, Thawte Consulting, Entrust Technologies) Andrea Manconi Sicurezza: Certificati Digitali Lo svantaggio delle chiavi asimmetriche è la potenza di calcolo elevata !!! In genere molti sistemi utilizzano un compromesso tra chiavi simmetriche e asimmetriche. Utilizzano le chiavi asimmetriche per identificarsi reciprocamente poi si scambiano una chiave simmetrica separata per cifrare gli scambi. Chiave basata sulla tecnologia DES (Data Encryption Standard) Andrea Manconi SSL SSL: Secure Sockets Layer. Si interpone tra l’HTTP e il TCP/IP Si occupa della sicurezza con il ricorso della crittografia a chiave pubblica per lo scambio di chiavi simmetriche che cifrano la comunicazione client-server. La tecnologia SSL è stata sviluppata da Netscape Andrea Manconi SSL Funzionamento: L’utente si connette al sito sicuro SSL. I siti protetti con SSL hanno URL del tipo https://.... (HTTP più SSL) Il server firma la sua chiave pubblica con la sua chiave privata Il browser usa la chiave pubblica del server per verificare che la persona che ha firmato la chiave sia effettivamente il suo proprietario Andrea Manconi SSL Il browser verifica se un’autorità di certificazione fidata ha firmato la chiave. Se non c’è questo tipo di firma il browser chiede all’utente di accettare o meno la firma. Il client genera una chiave simmetrica che viene cifrata con la chiave pubblica del server e rinviata a quest’ultimo. Andrea Manconi Distribuzione di carico Distribuzione di carico Problema: Gestione di siti ad alto traffico Soluzione: elaborazione tra più server backend (suddivisione del carico e maggiore affidabilità) Andrea Manconi Distribuzione di carico Vantaggi Maggiore robustezza Prestazioni ottimizzate (più richieste) Svantaggi Regole severe da seguire Risultati apprezzabili solo sotto eccessivo carico Aumento dei tempi e dei costi di realizzazione Andrea Manconi Distribuzione di carico Spesso il costo di un’applicazione distribuita è talmente oneroso che si preferisce spendere a livello di hardware Andrea Manconi Distribuzione di carico Stili di distribuzione No clustering: le servlet vengono eseguite su un’unica JVM (Tomcat) Andrea Manconi Distribuzione di carico Clustering senza migrazione di sessione le servlet di un’applicazione web possono essere eseguite su più macchine, mentre le richieste di sessione sono legate al server backend sul quale sono state inizialmente avviate Svantaggio: crash server => sessioni interrotte Andrea Manconi Distribuzione di carico Clustering con migrazione di sessione migrazione delle sessioni per migliorare il bilanciamento di carico. Per evitare problemi di concomitanza si garantisce che tutte le richieste che fanno parte di una sessione possono essere gestite solo su un’unica VM alla volta Andrea Manconi Riferimenti http://java.sun.com/webservices/docs/1.0/tutorial/ http://jakarta.apache.org/ http://java.sun.com/j2ee/1.4/docs/api/ http://servlets.com http://oreilly.com/catalog/jservlet2 http://www.fastcgi.com http://www.activeserverpages.com http://www.java.sun.com/products/jsp http://www.php.net Andrea Manconi