diff --git a/R3.01/README.md b/R3.01/README.md
index f336a95..0615a48 100644
--- a/R3.01/README.md
+++ b/R3.01/README.md
@@ -33,6 +33,8 @@ Les notions suivantes seront abordées :
 | 1 : 24/03 - 28/03| [Bases du langages](./cours/cm_bases_php.pdf)             | [tp1](./tp/tp1)       |
 | 2 : 03/04 - 07/04  | [Intéractions avec le client](./cours/cm_interaction_client_serveur.pdf)     | [tp2](./tp/tp2)       |
 | 3 : 10/04 - 14/04  | [PHP/MySQL](./cours/cm_extension_mysqli.pdf)            | [tp3](./tp/tp3)       |
+| 4 : 28/04 - 02/05  |    [Cookies et sessions](./cours/cm_cookies_sessions.pdf)         | [tp3](./tp/tp3)       |
+| 5 : 05/05 - 09/05  |            | [tp4](./tp/tp4)       |
 
 ## Les TPS
 
@@ -55,4 +57,11 @@ aborde l'interfaçage de php avec mysql, au moyen de l'extention
 À chaque exercice correspond  un  sous répertoire avec
 des fichiers à compléter.
 
+#### TP4 : Cookies et sessions 
+Le [tp4](./tp/tp4)
+aborde la notion de cookies et de sessions,et 
+les fonctions php dédiées.
+À chaque exercice correspond  un  sous répertoire avec
+des fichiers à compléter.
+
 
diff --git a/R3.01/cours/cm_cookies_sessions.pdf b/R3.01/cours/cm_cookies_sessions.pdf
new file mode 100644
index 0000000..b270f21
Binary files /dev/null and b/R3.01/cours/cm_cookies_sessions.pdf differ
diff --git a/R3.01/tp/tp4/README.md b/R3.01/tp/tp4/README.md
new file mode 100644
index 0000000..8c22000
--- /dev/null
+++ b/R3.01/tp/tp4/README.md
@@ -0,0 +1,76 @@
+
+#  TP4 : Cookies et sessions en PHP.
+
+### Ex1.
+Complétez le script `index.php` de l'exercice 1 de manière à
+mémoriser grâce à un cookie votre os préféré (parmi Linux, Windows et
+MacOS). Le cookie est valable pendant une minute, et l'os par
+défaut est Linux.
+
+![](./img/cookie.png)
+### Ex2.
+Le but est de créer un min-jeu de morpion.
+
+![](./img/ttt.png)
+
+Les variables de session :
+- `grid` : le plateau du jeu. tableau de 9 cases, prennant les valeurs 0 (libre), 1 (joueur 1), 2 (joueur 2).
+- `playerTurn` : le joueur qui joue.
+
+Le script prend en paramètre la variable `pos` : la position du coup joué par le joueur.
+
+### Ex3.
+On désire rendre les pages du [tp3](./../tp3) (cinema) accessibles
+uniquement à des utilisateur **inscrits au préalable**.
+
+1. Rajouter à la base une table `user` qui comprend un **login**,
+**email** et un **password**. (login est la clé)
+2. Ecrire un formulaire d'inscription au site qui comprend les
+   champs correspondants. Vous enregistrerez dans la base la mot de
+   passe hashé avec la fonction
+    [password\_hash](http://php.net/manual/fr/function.password-hash.php)
+    de php.
+3. Faire en sorte que toutes les pages de l'application soient
+    accessibles **uniquement** si l'utilisateur s'est authentifié.
+    (utiliser une session)
+
+Ecrire les scripts ou pages suivants
+<dl>
+<dt><code>inscription.php</code></dt>
+<dd>formulaire d'inscription, et qui traite les données du formulaire.
+Si le formulaire n'est pas correctement rempli, Il est réaffiché.
+(les champs correctes sont conservés !)</dd>
+<dt><code>authentification.html</code></dt>
+<dd>formulaire d'authentification.</dd>
+<dt><code>verification.php</code></dt>
+<dd>traite le formulaire précédent et vérifie si l'utilisateur est
+enregistré. En cas de succés, renvoie vers la page d'accueil du
+site. Pour éviter des attaques force brute, ajoutez une
+temporisation qui ralentira de telles attaques.</dd>
+<dt><code>securite.php</code></dt>
+<dd>morceau de code que vous inclurez systématiquement dans vos pages
+que vous voulez rendre accessible uniquement aux utilisateurs dûment
+authentifiés. Ce script vérifiera l'existence d'une variable de
+session créée lors de la connexion.</dd>
+</dl>
+
+Pour permettre l'authentification d'un utilisateur, il faut que
+login et le mot de passe conviennent. On compare le hash de
+l'utilisateur stocké dans la base avec le hashage calculé du
+password soumis lors de l'authentification :  
+
+
+```php
+<?php
+// Voir l'exemple fourni sur la page de la fonction password_hash()
+// pour savoir d'où cela provient.
+$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';
+
+if (password_verify('rasmuslerdorf', $hash)) {
+	echo 'Le mot de passe est valide !';
+} else {
+	echo 'Le mot de passe est invalide.';
+}
+?>
+```
+
diff --git a/R3.01/tp/tp4/ex1/index.php b/R3.01/tp/tp4/ex1/index.php
new file mode 100644
index 0000000..b1873cc
--- /dev/null
+++ b/R3.01/tp/tp4/ex1/index.php
@@ -0,0 +1,6 @@
+<?php
+$osSet = ['linux','apple','windows'];
+$os = "linux";
+
+include './views/main.php';
+?>
diff --git a/R3.01/tp/tp4/ex1/views/main.php b/R3.01/tp/tp4/ex1/views/main.php
new file mode 100644
index 0000000..2aedb2d
--- /dev/null
+++ b/R3.01/tp/tp4/ex1/views/main.php
@@ -0,0 +1,44 @@
+<!doctype html>
+<html>
+	<head>
+		<meta charset="UTF-8">
+		<link
+		rel="stylesheet"
+		href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css"
+		/>
+		<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
+
+	</head>
+	<body>
+		<main class="container">
+			<form method="POST">
+				<fieldset class="grid">
+					<legend>Changez votre os</legend>
+					<label>
+						<input type="radio" name="os" value="linux"> 
+						<i class="fa fa-linux fa-2x" aria-hidden="true"></i>
+					</label>
+					<label>
+						<input type="radio" name="os" value="windows"> 
+						<i class="fa fa-windows fa-2x" aria-hidden="true"></i>
+					</label>
+					<label>
+						<input type="radio" name="os" value="apple"> 
+						<i class="fa fa-apple fa-2x" aria-hidden="true"></i>
+					</label>
+				</fieldset>
+
+				<button type="submit">Envoyer</button> 
+			</form>
+			<article>
+				<header>Votre os</header>
+				<?php echo "<i class='fa fa-$os fa-5x'></i>";?>
+				<footer>
+					Rafraîchir la page <a href=""><i class="fa fa-refresh" aria-hidden="true"></i></a>
+				</footer>
+			</article>
+
+		</main>
+	</body>
+</html>
+
diff --git a/R3.01/tp/tp4/ex2/css/style.css b/R3.01/tp/tp4/ex2/css/style.css
new file mode 100644
index 0000000..3a5f75c
--- /dev/null
+++ b/R3.01/tp/tp4/ex2/css/style.css
@@ -0,0 +1,32 @@
+table.morpion{
+	border-collapse: collapse;
+	table-layout:fixed;
+	margin-left:auto;
+	margin-right:auto;
+	display:inline-block;
+	width:auto;
+}
+table.morpion td {
+	border : 1px solid #aaaaaa;
+	width:10rem;
+	height:10rem;
+	padding : 0px;
+	margin:0px;
+	overflow: hidden;
+	white-space: nowrap;
+	text-align:center;
+	vertical-align:middle;
+}
+table.morpion i {
+font-size:8rem;
+}
+
+table.morpion a {
+display : inline-block;
+width : 8rem;
+height: 8rem;
+
+}
+.center{
+	text-align:center;
+}
diff --git a/R3.01/tp/tp4/ex2/helpers.php b/R3.01/tp/tp4/ex2/helpers.php
new file mode 100644
index 0000000..211e12c
--- /dev/null
+++ b/R3.01/tp/tp4/ex2/helpers.php
@@ -0,0 +1,54 @@
+<?php
+function isWinner($grid, $player)
+{
+	$winStates = array
+		(
+			array(0, 1, 2), array(3, 4, 5), array(6, 7, 8),     // Horizontal
+			array(0, 3, 6), array(1, 4, 7), array(2, 5, 8),     // Vertical
+			array(0, 4, 8), array(2, 4, 6)                      // Diagonal
+		);
+
+	foreach ($winStates as $winState)
+	{
+		if ($grid[$winState[0]] == $player &&
+			$grid[$winState[1]] == $player &&
+			$grid[$winState[2]] == $player)
+		{
+			return true;
+		}
+	}
+	return false;
+}
+
+function noWinner($grid)
+{
+	for($i = 0; $i < 9; $i++)
+		if ($grid[$i] == 0) 
+			return false;
+
+	return true;
+}
+
+function displayGrid($grid)
+{
+	echo '<table class="morpion">';
+	for ($i = 0; $i < 3; $i ++){
+		echo "<tr>";
+		for ($j = 0; $j < 3; $j ++){
+
+			echo "<td>";
+
+			$pos = 3*$i + $j;
+			if ($grid[$pos] == 0)
+				echo "<a href='?pos=$pos'></a>";
+			if ($grid[$pos] == 1)
+				echo '<i class="fa fa-times" aria-hidden="true"></i>';
+			if ($grid[$pos] == 2)
+				echo '<i class="fa fa-circle-o" aria-hidden="true"></i>';
+
+			echo "</td>";
+		}
+		echo "</tr>";
+	}
+	echo "</table>";
+}
diff --git a/R3.01/tp/tp4/ex2/index.php b/R3.01/tp/tp4/ex2/index.php
new file mode 100644
index 0000000..2c1717b
--- /dev/null
+++ b/R3.01/tp/tp4/ex2/index.php
@@ -0,0 +1,11 @@
+<?php
+include 'helpers.php';
+
+// view variables 
+$message = "";
+$grid = [0,1,0,1,0,2,2,0,0]; 
+$playerTurn = 1; // 1 or 2
+
+
+include './views/tictactoe.php';
+
diff --git a/R3.01/tp/tp4/ex2/views/tictactoe.php b/R3.01/tp/tp4/ex2/views/tictactoe.php
new file mode 100644
index 0000000..130bf00
--- /dev/null
+++ b/R3.01/tp/tp4/ex2/views/tictactoe.php
@@ -0,0 +1,24 @@
+<html>
+	<head>
+		<meta charset="UTF-8">
+		<link
+	  rel="stylesheet"
+   href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css"
+   />
+		<link rel="stylesheet" href="./css/style.css">
+		<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
+
+	</head>
+	<body>
+		<main class="container center">
+			<h4>Tic Tac Toe : <?php echo "player $playerTurn turn";?></h4>
+			<?php
+				displayGrid($grid);
+
+				if ($message != "")
+					echo "<h5>$message  <a  href='.'>new game</a></h5>";
+			  ?>
+		</main>
+	</body>
+</html>
+
diff --git a/R3.01/tp/tp4/img/cookie.png b/R3.01/tp/tp4/img/cookie.png
new file mode 100644
index 0000000..f54392b
Binary files /dev/null and b/R3.01/tp/tp4/img/cookie.png differ
diff --git a/R3.01/tp/tp4/img/ttt.png b/R3.01/tp/tp4/img/ttt.png
new file mode 100644
index 0000000..daf90ff
Binary files /dev/null and b/R3.01/tp/tp4/img/ttt.png differ
diff --git a/R3.01/tp/tp4/tp4.tar.gz b/R3.01/tp/tp4/tp4.tar.gz
new file mode 100644
index 0000000..4f5995c
Binary files /dev/null and b/R3.01/tp/tp4/tp4.tar.gz differ