Hola Elías,
el protocolo HTTP tiene como una de sus características que no tiene estado, es decir, las peticiones no se responden en el contexto de una "conexión", como lo hace por ejemplo los protocolos FTP, IMAP o POP3 entre otros, en los que una vez que conectaste, todo el tráfico se desarrolla en el contexto de una conexión, y dicha conexión identifica unívocamente al usuario.
En HTTP tenés que implentar vos algún mecanismo para simular una "conexión", ya que el protocolo no la implementa. La opción más simple para mantener una conexión en PHP es con sesiones, tal y como te dice @lladruc, pero esto implicaría que para iniciar la sesión, primero deberías tener un mecanismo para que la aplicación que consume se identifique con el WebService.
Si estás en el escenario de una webapp, deberías tener almacenada en ella el usuario y contraseña o un token o un identificador de algún tipo, para que el WebService lo reciba y valide y solo si es válido devolver el JSON.
Ahora bien, si estás enviando todo esto por GET en un servidor HTTP, ver la petición GET con el usuario/clave o token la primera vez es bastante simple. Tu WebService debería estar sobre HTTPS para que todo esto no sea una pérdida de tiempo.
Una vez validado el usuario/aplicación, el mecanismo de las sesiones tal vez te sea suficiente. En realidad las sesiones son duplicables con un poco de esfuerzo.
Otra solución completamente distinta es que no respondas con un JSON, sino con contenido cifrado, y que tu aplicación que consume el servicio lo descifre antes de usarlo: de esta manera puedo acceder y ver la respuesta, pero al ver el contenido parecerá basura.
Saludos cordiales!