Evästeet ja sessiot

Luennolla käsitellään evästeitä ja sessioita mod_pythonilla.

Evästeet

Yleistä evästeistä

Evästeet ovat tekstimuotoista tietoa, jota palvelin voi lähettää selaimelle. Evästeelle voidaan määrätä haluttu elinikä, jonka ajan selain säilyttää evästeeseen tallennettua tietoa. Oletuselinikä evästeillä on meneillään oleva sessio, joka tarkoittaa, että tietoa säilytetään vain siihen asti, kun selain suljetaan. Tyypillisesti selain säilyttää tällaisia session mittaisia evästeitä muistissa. Jos evästeen elinikä on määritelty pidemmäksi, tallentaa selain sen tiedostoon.

Seuraavan kerran, kun selain pyytää sivua, se lähettää evästeen palvelimelle. Palvelimella toimiva WWW-sovellus voi hyödyntää edellisellä kerralla tallennettua tietoa. Evästettä voidaan ajatella siis eräänlaisena muuttujana, johon voidaan tallentaa tekstiä. Tieto on siten aina käytettävissä seuraavilla kerroilla, kun sivustoa käytetään.

Evästeessä voidaan säilyttää esimerkiksi ostoskorin tiedot verkkokaupassa, jolloin käyttäjä voi jättää ostoksensa kesken ja jatkaa niitä sujuvasti seuraavalla kerralla. Mitään arkaluontoista tietoa evästeissä ei kuitenkaan saa säilyttää, sillä ne ovat puhdasta kenen tahansa luettavissa olevaa tekstitietoa. Myöskään mitään tärkeää säilytettävää tietoa ei kannata tallettaa evästeissä, sillä ne ovat helposti poistettavissa.

Selaimella on aina jokin raja siitä, kuinka suuria evästeet saavat olla ja kuinka paljon niitä voidaan tallentaa. Jokaisen selaimen pitäisi kuitenkin täyttää suosituksen minimirajat:

Evästeen asettaminen yleisesti

Palvelin lähettää evästeen http-vastauksen otsikkotiedoissa. Otsikkotiedoissa lähetetään selaimelle rivi, joka on seuraavaa muotoa:

Set-Cookie: NAME=VALUE; expires=DATE; path=PATH; domain=DOMAIN_NAME; secure

NAME tarkoittaa evästeen nimeä ja VALUE arvoa (merkkijono), joka evästeelle annetaan. Nimi on ainoa pakollinen tieto, joka evästeelle täytyy joka tapauksessa määrittää. Muut tiedot voidaan haluttaessa jättää tyhjiksi.

expires-määritys määrittää ajan, mihin asti eväste on voimassa, eli mihin asti selainta pyydetään sitä säilyttämään. Aika (DATE) ilmoitetaan muodossa: "05-May-2004 07:31:27 GMT". Jos aikaa ei määritellä, on eväste oletuksena voimassa vain session ajan.

path-määritys määrittelee palvelimen polun, jossa eväste on voimassa. Oletuksena eväste on voimassa samassa kansiossa ja sen kansion alikansioissa. Tämä tarkoittaa sitä, että jokaisella kerralla, kun selain pyytää jotain sivua evästeen voimassaoloalueelta, se lähettää evästeen palvelimelle http-pyynnön mukana. Jos poluksi määritellään vain "/", on se voimassa koko domainissa.

domain-määrityksellä voidaan määritellä evästeen vaikutusalueeksi kaikki palvelimen alidomainit. Jos arvoksi määritellään esim. ".jyu.fi", on eväste voimassa kaikissa Jyväskylän yliopiston alidomaineissa.

secure-määrityksellä voidaan määrätä, että selain lähettää evästeen palvelimelle ainoastaan silloin, kun on käytössä salattu yhteys (HTTPS/SSL). Tämä ilmaistaan siis lisäämällä sana "secure" evästeen määreisiin.

Eväste asetetaan aina HTTP-otsakkeissa mikä tarkoittaa, että sovellus, joka on jo ehtinyt tulostaa XHTML-koodia ei voi enää asettaa kyseisellä sivulla evästeitä!

Sessiot

Yleistä sessioista

Sessionhallinta on tekniikka, jonka avulla on tarkoitus säilyttää turvallisesti tietoa yhden session ajan, eli siihen asti, kunnes käyttäjä lopettaa session tai sulkee selaimen. Sessioilla toteutetaan usein esimerkiksi kirjautuminen erilaisiin palveluihin. Keskeisin ero evästeisiin on se, että sessioon liittyviä tietoja ei normaalisti välitetä lainkaan selaimelle, vaan se säilytetään palvelimella. Palvelin säilyttää asetuksista riippuen sessiotiedon joko tietokannassa, tiedostossa, muistissa. Session tiedot voidaan säilyttää myös evästeessä. Evästettä käytettäessä tallennuspaikkana on käyttäjän oma selain. Flask tallentaa sessiomuuttujat evästeeseen ja käyttää tässä apuna salausta.

Silloin, kun sessio käynnistetään, sille luodaan yksilöllinen sessiotunniste. Sessioon voidaan sen jälkeen asettaa haluttu määrä ns. sessiomuuttujia. Sessiotietoon päästään myöhemmin käsiksi sessiotunnisteiden avulla. Tämän vuoksi sessiotunniste on jollain tavalla aina välitettävä selaimelle.

Sessiotunnisteen välittämiseen on kaksi tapaa: välittää sitä URL:n mukana tai säilyttää evästeessä. Sessiotunnisteen välittämiseen URL:n mukana sisältyy enemmän tietoturvariskejä joten lähes aina suositaankin evästeitä.

Sessioiden käyttäminen Flask-sovelluksessa:

from flask import Flask, session, redirect, url_for, escape, request

app = Flask(__name__)
# Flask vaatii sessioiden käyttämiseen salaisen avaimen. Tätä ei pidä paljastaa muille:
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
# Hyvä salainen avain voidaan generoida esim. seuraavasti:
#import os
#print os.urandom(24)

@app.route('/')
def index():
    # Jos käyttäjätunnus löytyy sessiosta niin ollaan kirjautuneita
    if 'username' in session:
        return 'Logged in as %s' % escape(session['username'])
    # Jos ei löydy niin ohjataan kirjautumissivulle
    return redirect(url_for('login'))

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        # Kirjaudutaan sisään. Sijoitetaan session-muuttujaan käyttäjätunnus
        session['username'] = request.form['username']
        return redirect(url_for('index'))
    return render_template('login.html')

@app.route('/logout')
def logout():
    # Poistetaan tunnus sessiosta
    session.pop('username', None)
    return redirect(url_for('index'))

Kaaviokuva sessioiden toiminnasta

Flask Snippets: Sessions

Käyttäjien kommentit

Kommentoi Lisää kommentti
Kurssimateriaalien käyttäminen kaupallisiin tarkoituksiin tai opetusmateriaalina ilman lupaa on ehdottomasti kielletty!
http://appro.mit.jyu.fi/web-sovellukset/luennot/cookies/
© Tommi Lahtonen (tommi.j.lahtonen@jyu.fi) <http://hazor.iki.fi/>
2016-02-29 12:12:03
Informaatioteknologia - Jyväskylän yliopiston informaatioteknologian tiedekunta