You can put buckets and objects which only allow access to the owner by passing an empty acl string. By owner i'm referering to the owning Amazon account, not the user in your application.
This example creates a single bucket then uploads an image into a sub folder.
<cfscript>
s3 = createobject("component", "s3").init(accessKeyId, secretAccessKey);
s3.putBucket("myapps-bucket", "");
s3.putObject(
bucketName="myapps-bucket",
fileKey="image.png",
contentType="image/png",
acl="",
keyName="user1234/image.png"
);
</cfscript>
To display the image to the user you must generate a signed link to the object othewrwise they will get an authorisation error from s3
<!--- signed link valid for 30 mins --->
<cfset link = s3.getObject(bucket, "user1234/image.png", 30) />
<cfoutput>
<img src="#link#" />
</cfoutput>
Currently it is only possible to have 100 buckets per Amazon account, so i would recommend using a folder per user rather than separate buckets.