Cache drupal private images
I finally found how to handle it : there is a hook_file_download where i can add and set header for the file : 

function mymodule_file_download($uri){


// Getting file info
  $info = image_get_info($uri);

  // For images files
  if(isset($info['mime_type']) &amp;&amp; strpos($info['mime_type'], 'image/') === 0){
    // cache max-age : 1 day 
    // expire-date : now + 86400 s
    // etag using a hash of the file size variable
    return array('Cache-Control' =&gt; 'max-age=86400, private',
                 'Expires' =&gt; gmdate('D, d M Y H:i:s', time() + 86400) .' GMT',
                 'Last-Modified' =&gt; gmdate('D, d M Y H:i:s', time() - 86400) .' GMT',
                 'ETag' =&gt; strtr(md5($info['file_size']), 0, 10));
  }
}