diff --git a/synapse/api/auth.py b/synapse/api/auth.py
index 6f8146ec3a0aeef76ca17c1d9932dfe5bd6ee066..739f77afd4f2f90cf3614f2401fe2e6cfd26cc9c 100644
--- a/synapse/api/auth.py
+++ b/synapse/api/auth.py
@@ -223,8 +223,17 @@ class Auth(object):
             user = yield self.get_user_by_token(access_token)
 
             ip_addr = self.hs.get_ip_from_request(request)
+            user_agent = request.requestHeaders.getRawHeaders(
+                "User-Agent",
+                default=[""]
+            )[0]
             if user and access_token and ip_addr:
-                self.store.insert_client_ip(user, access_token, ip_addr)
+                self.store.insert_client_ip(
+                    user,
+                    access_token,
+                    ip_addr,
+                    user_agent
+                )
 
             defer.returnValue(user)
         except KeyError:
diff --git a/synapse/storage/__init__.py b/synapse/storage/__init__.py
index d53c090a91b4270cfc3b2d2027a63af0d1a1e9c3..169a80dce4734cc4c249ccb966a69fbcfa57daa8 100644
--- a/synapse/storage/__init__.py
+++ b/synapse/storage/__init__.py
@@ -294,13 +294,15 @@ class DataStore(RoomMemberStore, RoomStore,
 
         defer.returnValue(self.min_token)
 
-    def insert_client_ip(self, user, access_token, ip):
+    def insert_client_ip(self, user, access_token, ip, user_agent):
         return self._simple_insert(
             "user_ips",
             {
                 "user": user.to_string(),
                 "access_token": access_token,
-                "ip": ip
+                "ip": ip,
+                "user_agent": user_agent,
+                "last_used": int(self._clock.time()),
             }
         )
 
diff --git a/synapse/storage/schema/delta/v5.sql b/synapse/storage/schema/delta/v5.sql
index 380eec6f354ccebb97d7aa67e474d96d372eb102..f5a667a2501f9d9916aec10720005bdce769f5ed 100644
--- a/synapse/storage/schema/delta/v5.sql
+++ b/synapse/storage/schema/delta/v5.sql
@@ -3,7 +3,9 @@ CREATE TABLE IF NOT EXISTS user_ips (
     user TEXT NOT NULL,
     access_token TEXT NOT NULL,
     ip TEXT NOT NULL,
-    CONSTRAINT user_ip UNIQUE (user, access_token, ip) ON CONFLICT IGNORE
+    user_agent TEXT NOT NULL,
+    last_used INTEGER NOT NULL,
+    CONSTRAINT user_ip UNIQUE (user, access_token, ip, user_agent) ON CONFLICT REPLACE
 );
 
 CREATE INDEX IF NOT EXISTS user_ips_user ON user_ips(user);
diff --git a/synapse/storage/schema/users.sql b/synapse/storage/schema/users.sql
index 89eab8babe46fbc1f61ba1efcce1e5457f2ed72c..d96dd9f075f55e93066abc84e33df8ab7b2ad20d 100644
--- a/synapse/storage/schema/users.sql
+++ b/synapse/storage/schema/users.sql
@@ -35,7 +35,9 @@ CREATE TABLE IF NOT EXISTS user_ips (
     user TEXT NOT NULL,
     access_token TEXT NOT NULL,
     ip TEXT NOT NULL,
-    CONSTRAINT user_ip UNIQUE (user, access_token, ip) ON CONFLICT IGNORE
+    user_agent TEXT NOT NULL,
+    last_used INTEGER NOT NULL,
+    CONSTRAINT user_ip UNIQUE (user, access_token, ip, user_agent) ON CONFLICT REPLACE
 );
 
 CREATE INDEX IF NOT EXISTS user_ips_user ON user_ips(user);