# Users | Sentry for macOS

Users consist of a few critical pieces of information that construct a unique identity in Sentry. Each of these is optional, but one **must** be present for the Sentry SDK to capture the user:

### [`userId`](https://docs.sentry.io/.md#userid)

If you don't provide a `userId`, the SDK falls back to `installationId`, which the SDK randomly generates once during an app's installation.

Your internal identifier for the user.

### [`username`](https://docs.sentry.io/.md#username)

The username. Typically used as a better label than the internal id.

### [`email`](https://docs.sentry.io/.md#email)

An alternative, or addition, to the username. Sentry is aware of email addresses and can display things such as Gravatars and unlock messaging capabilities.

### [`ip_address`](https://docs.sentry.io/.md#ip_address)

The user's IP address. If the user is unauthenticated, Sentry uses the IP address as a unique identifier for the user. Serverside SDKs that instrument incoming requests will attempt to pull the IP address from the HTTP request data (`request.env.REMOTE_ADDR` field in JSON), if available. That might require `sendDefaultPii` set to `true` in the SDK options.

If the user's `ip_address` is set to `"{{auto}}"`, Sentry will infer the IP address from the connection between your app and Sentry's server. Due to backward compatibility concerns, Sentry sets the IP address to `"{{auto}}"` out of the box for Apple. Therefore setting `sendDefaultPii` to `false` won't stop Sentry from collecting users' IP addresses via the client connection. Read the paragraphs below to find out how to opt out of collecting users' IP addresses.

If the field is omitted, the default value is `null`. However, due to backwards compatibility concerns, certain platforms (in particular JavaScript) have a different default value for `"{{auto}}"`. SDKs and other clients should not rely on this behavior and should set IP addresses or `"{{auto}}"` explicitly.

To opt out of storing users' IP addresses in your event data, you can go to your project settings, click on "Security & Privacy", and enable "Prevent Storing of IP Addresses" or use Sentry's [server-side data](https://docs.sentry.io/security-legal-pii/scrubbing.md) scrubbing to remove `$user.ip_address`. Adding such a rule ultimately overrules any other logic.

Additionally, you can provide arbitrary key/value pairs beyond the reserved names, and the Sentry SDK will store those with the user.

To identify the user:

```swift
import Sentry

let user = User()
user.email = "john.doe@example.com"
// Start the SDK before setting the user, otherwise it will be ignored.
SentrySDK.setUser(user)
```

You can also clear the currently set user:

```swift
import Sentry

SentrySDK.setUser(nil)
```
