{"action":"created","comment":{"url":"https://api.github.com/repos/terasolunaorg/guideline/pulls/comments/48705093","id":48705093,"diff_hunk":"@@ -0,0 +1,542 @@\n+.. _SpringSecuritySessionManagement:\r\n+\r\n+セッション管理\r\n+================================================================================\r\n+\r\n+.. only:: html\r\n+\r\n+ .. contents:: 目次\r\n+    :local:\r\n+\r\n+Overview\r\n+--------------------------------------------------------------------------------\r\n+\r\n+本節では、Webアプリケーションでセッションを扱う際上で\r\n+\r\n+* 必要となるセキュリティ対策\r\n+* Spring Securityがサポートしている対策\r\n+\r\n+を紹介しながら、Spring Securityが提供しているセッション管理機能について説明する。\r\n+\r\n+Spring Securityでは以下のセッションについて、主に以下の機能が提供されている。\r\n+\r\n+.. tabularcolumns:: |p{0.25\\linewidth}|p{0.75\\linewidth}|\r\n+.. list-table:: **セッションに関する提供機能**\r\n+    :header-rows: 1\r\n+    :widths: 25 75\r\n+\r\n+    * - 機能\r\n+      - 説明\r\n+    * - | セキュリティ対策\r\n+      - | セッションハイジャック攻撃等のセッショIDを使用した攻撃への対策機能を。\r\n+    * - | ライフサイクル制御\r\n+      - | セッションの生成～破棄までのライフサイクルを制御する機能。\r\n+    * - | タイムアウト制御\r\n+      - | タイムアウトにより、セッションを破棄する機能。\r\n+    * - | 多重ログイン制御\r\n+      - | 同一ユーザーによる多重ログイン時のセッションを制御する機能。\r\n+\r\n+.. _SpringSecuritySessionManagementSetup:\r\n+\r\n+How to use\r\n+--------------------------------------------------------------------------------\r\n+\r\n+セッション管理機能の適用\r\n+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n+\r\n+セッション管理機能を適用する方法を説明する。\r\n+セッション管理機能の処理を使用する場合は、以下のようなbean定義を行う。\r\n+\r\n+* \\ ``spring-security.xml``\\ の定義例\r\n+\r\n+.. code-block:: xml\r\n+\r\n+    <sec:http>\r\n+        <!-- ommited -->\r\n+        <sec:session-management /> <!-- (1) -->\r\n+        <!-- ommited -->\r\n+    </sec:http>\r\n+\r\n+.. tabularcolumns:: |p{0.10\\linewidth}|p{0.90\\linewidth}|\r\n+.. list-table::\r\n+    :header-rows: 1\r\n+    :widths: 10 90\r\n+\r\n+    * - 項番\r\n+      - 説明\r\n+    * - | (1)\r\n+      - | \\ ``<sec:http>``\\ 要素の子要素として\\ ``<sec:session-management>``\\ 要素を指定する。\r\n+        | \\ ``<sec:session-management>``\\ 要素を指定すると、セッション管理機能が適用される。\r\n+\r\n+.. _SpringSecuritySessionManagementSecurityMeasure:\r\n+\r\n+セッション利用時のセキュリティ対策\r\n+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n+\r\n+Webアプリケーションでセッションを扱う場合、一般的には以下の攻撃に対して対策が必要となる。\r\n+\r\n+.. tabularcolumns:: |p{0.30\\linewidth}|p{0.70\\linewidth}|\r\n+.. list-table::\r\n+    :header-rows: 1\r\n+    :widths: 30 70\r\n+\r\n+    * - 対策\r\n+      - 説明\r\n+    * - | セッションハイジャック攻撃\r\n+      - | 通信の盗聴、規則性からの類推、クロスサイトスクリプティングなどを駆使してセッションIDを盗みとり、盗みとったセッションIDをつかっているユーザーになりすましてシステムを利用する攻撃。\r\n+    * - | セッション固定攻撃\r\n+      - | 攻撃者が事前に払い出したセッションIDを他人に使わせてシステムにログインさせ、攻撃者がログインしたユーザーになりすましてシステムを利用する攻撃です。\r\n+\r\n+セッションハイジャック攻撃への対策\r\n+\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\r\n+\r\n+セッションハイジャック攻撃への対策は、セッションIDが盗み取られないようにするしかない。\r\n+いったん盗み取られてしまうと、アプリケーションサーバは正規のユーザーからのリクエストなのか、\r\n+攻撃者からのリクエストなのかを判断することができない。\r\n+\r\n+このようなセッションハイジャック攻撃からアプリケーションを守るためには、以下のような対策が必要である。\r\n+\r\n+.. tabularcolumns:: |p{0.30\\linewidth}|p{0.70\\linewidth}|\r\n+.. list-table:: **セッションハイジャック攻撃への対策**\r\n+    :header-rows: 1\r\n+    :widths: 30 70\r\n+\r\n+    * - 対策\r\n+      - 説明\r\n+    * - | 推測困難なセッションIDの生成する\r\n+      - | 連番など推測できる値をセッションIDに使用せず、推測が困難な(セキュアな)ランダム値を使用する。\r\n+        | 基本的にはアプリケーションサーバが提供するセッションIDの生成機構を利用すればよい。\r\n+    * - | HTTPSを使って通信を暗号化する\r\n+      - | 盗まれると困る情報をやりとりする通信は、HTTPSプロトコルを使って暗号化する。\r\n+        | 通信の盗聴はフリーのソフトなどを使って簡単に行うことができため、盗聴されても解読されないように暗号化しておくことが重要である。\r\n+    * - | セッションIDはCookieを使って連携する\r\n+      - | クライアントとサーバーとの間でセッションIDを連携する際は、Cookieを使って連携するように設定し、URL Rewriting機能を無効化する。\r\n+    * - | Cookieの\\ ``HttpOnly``\\ 属性を指定する\r\n+      - | Cookieの\\ ``HttpOnly``\\ 属性を指定すると、JavaScriptからCookieにアクセスすることができなくため、クロスサイトスクリプティングを使ってセッションIDを盗むことができなくなる。\r\n+    * - | Cookieに\\ ``Secure``\\ 属性を指定する\r\n+      - | Cookieに\\ ``Secure``\\ 属性を指定すると、HTTPS通信の時だけCookieをサーバーに送信するため、誤ってHTTP通信を使ってしまった時にセッションIDが盗み取られるリスクを減らすことができる。\r\n+\r\n+.. note:: **メモ**\r\n+\r\n+    URL Rewritingは、Cookieを使用できないクライアントとセッションを維持するための仕組みである。\r\n+    具体的には、URLのリクエストパラメータの中にセッションIDを含めることでクライアントとサーバーの間でセッションIDを連携する。\r\n+\r\n+    * URL Rewritingが行われたURL例\r\n+\r\n+        .. code-block:: guess\r\n+\r\n+            http://localhost:8080/;jsessionid=7E6EDE4D3317FC5F14FD912BEAC96646\r\n+\r\n+    \\ ``jsessionid=7E6EDE4D3317FC5F14FD912BEAC96646``\\ の部分がURL RewritingされたセッションIDになる。\r\n+    ServletのAPI仕様では、以下のメソッドを呼び出すとURL Rewritingが行われる可能性があり、JSTLやSpringが提供しているJSPタグライブラリの中でもこれらのメソッドを呼び出している。\r\n+\r\n+    * \\ ``HttpServletResponse#encodeURL(String)``\\\r\n+    * \\ ``HttpServletResponse#encodeRedirectURL(String)``\\\r\n+\r\n+URL Rewritingが行われるとURL内にセッションIDが露出してしまうため、セッションIDを盗まれるリスクが高くなる。\r\n+そのため、Cookieを使うことができるクライアントのみをサポートする場合は、サーブレットコンテナのURL Rewriting機能を無効化することを推奨する。\r\n+\r\n+Servlet 3.0以上に対応しているサーブレットコンテナを使用する際の無効化方法については、このあとのコラムで説明する。\r\n+Servlet 2.5以下のサーブレットコンテナを使う場合は、アプリケーションサーバから提供されている無効化方法を適用されたい。\r\n+\r\n+また、Spring SecurityはURL Rewritingを無効化するための仕組みも提供しており、この機能はデフォルトで適用されている。\r\n+Cookieを使えないクライアントをサポートする必要がある場合は、URL Rewritingを許可するようにBean定義する。\r\n+\r\n+* \\ ``spring-security.xml``\\ の定義例\r\n+\r\n+.. code-block:: xml\r\n+\r\n+    <sec:http disable-url-rewriting=\"false\"> <!-- falseを指定してURL Rewritingを有効化 -->\r\n+\r\n+.. tabularcolumns:: |p{0.10\\linewidth}|p{0.90\\linewidth}|\r\n+.. list-table::\r\n+    :header-rows: 1\r\n+    :widths: 10 90\r\n+\r\n+    * - 項番\r\n+      - 説明\r\n+    * - | (1)\r\n+      - | bean定義ファイルを使用した時のデフォルトの動作は、URL Rewritingが行われる可能性がある。\r\n+        | そのため、URL Rewritingが行われないようにする際は、\\ ``<sec:http>``\\ 要素の \\ ``disable-url-rewriting``\\ 属性に\\ ``true``\\ を設定する。\r\n+        | なお、Spring Security 4.0では、デフォルト値が\\ ``true``\\ である。\r","path":"source/Security/SessionManagement.rst","position":161,"original_position":161,"commit_id":"cab780055833a4a56fa750b9f3ce809f74a28d83","original_commit_id":"cab780055833a4a56fa750b9f3ce809f74a28d83","user":{"login":"btshimizukza","id":5626538,"avatar_url":"https://avatars.githubusercontent.com/u/5626538?v=3","gravatar_id":"","url":"https://api.github.com/users/btshimizukza","html_url":"https://github.com/btshimizukza","followers_url":"https://api.github.com/users/btshimizukza/followers","following_url":"https://api.github.com/users/btshimizukza/following{/other_user}","gists_url":"https://api.github.com/users/btshimizukza/gists{/gist_id}","starred_url":"https://api.github.com/users/btshimizukza/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/btshimizukza/subscriptions","organizations_url":"https://api.github.com/users/btshimizukza/orgs","repos_url":"https://api.github.com/users/btshimizukza/repos","events_url":"https://api.github.com/users/btshimizukza/events{/privacy}","received_events_url":"https://api.github.com/users/btshimizukza/received_events","type":"User","site_admin":false},"body":"- [ ] Spring Security 4.0からデフォルト値が変わったことを記載した方がよいのでは？他にもデフォルト値が変わっている個所があるので、全体的に整理してほしい。","created_at":"2016-01-04T05:26:43Z","updated_at":"2016-01-04T05:26:43Z","html_url":"https://github.com/terasolunaorg/guideline/pull/1515#discussion_r48705093","pull_request_url":"https://api.github.com/repos/terasolunaorg/guideline/pulls/1515","_links":{"self":{"href":"https://api.github.com/repos/terasolunaorg/guideline/pulls/comments/48705093"},"html":{"href":"https://github.com/terasolunaorg/guideline/pull/1515#discussion_r48705093"},"pull_request":{"href":"https://api.github.com/repos/terasolunaorg/guideline/pulls/1515"}}},"pull_request":{"url":"https://api.github.com/repos/terasolunaorg/guideline/pulls/1515","id":54605251,"html_url":"https://github.com/terasolunaorg/guideline/pull/1515","diff_url":"https://github.com/terasolunaorg/guideline/pull/1515.diff","patch_url":"https://github.com/terasolunaorg/guideline/pull/1515.patch","issue_url":"https://api.github.com/repos/terasolunaorg/guideline/issues/1515","number":1515,"state":"open","locked":false,"title":"[DON'T Merge] Spring security for review #1325","user":{"login":"ikeyat","id":7290819,"avatar_url":"https://avatars.githubusercontent.com/u/7290819?v=3","gravatar_id":"","url":"https://api.github.com/users/ikeyat","html_url":"https://github.com/ikeyat","followers_url":"https://api.github.com/users/ikeyat/followers","following_url":"https://api.github.com/users/ikeyat/following{/other_user}","gists_url":"https://api.github.com/users/ikeyat/gists{/gist_id}","starred_url":"https://api.github.com/users/ikeyat/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ikeyat/subscriptions","organizations_url":"https://api.github.com/users/ikeyat/orgs","repos_url":"https://api.github.com/users/ikeyat/repos","events_url":"https://api.github.com/users/ikeyat/events{/privacy}","received_events_url":"https://api.github.com/users/ikeyat/received_events","type":"User","site_admin":false},"body":"This PR is for pre-reviewing of #1325.\r\nDON'T merge.","created_at":"2015-12-26T17:50:40Z","updated_at":"2016-01-04T05:26:43Z","closed_at":null,"merged_at":null,"merge_commit_sha":"be2d8ff360159441b43029b0c604dc19055690f7","assignee":null,"milestone":{"url":"https://api.github.com/repos/terasolunaorg/guideline/milestones/6","html_url":"https://github.com/terasolunaorg/guideline/milestones/5.1.0","labels_url":"https://api.github.com/repos/terasolunaorg/guideline/milestones/6/labels","id":982377,"number":6,"title":"5.1.0","description":"","creator":{"login":"btshimizukza","id":5626538,"avatar_url":"https://avatars.githubusercontent.com/u/5626538?v=3","gravatar_id":"","url":"https://api.github.com/users/btshimizukza","html_url":"https://github.com/btshimizukza","followers_url":"https://api.github.com/users/btshimizukza/followers","following_url":"https://api.github.com/users/btshimizukza/following{/other_user}","gists_url":"https://api.github.com/users/btshimizukza/gists{/gist_id}","starred_url":"https://api.github.com/users/btshimizukza/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/btshimizukza/subscriptions","organizations_url":"https://api.github.com/users/btshimizukza/orgs","repos_url":"https://api.github.com/users/btshimizukza/repos","events_url":"https://api.github.com/users/btshimizukza/events{/privacy}","received_events_url":"https://api.github.com/users/btshimizukza/received_events","type":"User","site_admin":false},"open_issues":41,"closed_issues":26,"state":"open","created_at":"2015-02-17T05:31:45Z","updated_at":"2015-12-26T17:50:40Z","due_on":"2016-01-31T15:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/terasolunaorg/guideline/pulls/1515/commits","review_comments_url":"https://api.github.com/repos/terasolunaorg/guideline/pulls/1515/comments","review_comment_url":"https://api.github.com/repos/terasolunaorg/guideline/pulls/comments{/number}","comments_url":"https://api.github.com/repos/terasolunaorg/guideline/issues/1515/comments","statuses_url":"https://api.github.com/repos/terasolunaorg/guideline/statuses/cab780055833a4a56fa750b9f3ce809f74a28d83","head":{"label":"terasolunaorg:spring-security-for-review","ref":"spring-security-for-review","sha":"cab780055833a4a56fa750b9f3ce809f74a28d83","user":{"login":"terasolunaorg","id":2259156,"avatar_url":"https://avatars.githubusercontent.com/u/2259156?v=3","gravatar_id":"","url":"https://api.github.com/users/terasolunaorg","html_url":"https://github.com/terasolunaorg","followers_url":"https://api.github.com/users/terasolunaorg/followers","following_url":"https://api.github.com/users/terasolunaorg/following{/other_user}","gists_url":"https://api.github.com/users/terasolunaorg/gists{/gist_id}","starred_url":"https://api.github.com/users/terasolunaorg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/terasolunaorg/subscriptions","organizations_url":"https://api.github.com/users/terasolunaorg/orgs","repos_url":"https://api.github.com/users/terasolunaorg/repos","events_url":"https://api.github.com/users/terasolunaorg/events{/privacy}","received_events_url":"https://api.github.com/users/terasolunaorg/received_events","type":"Organization","site_admin":false},"repo":{"id":15253684,"name":"guideline","full_name":"terasolunaorg/guideline","owner":{"login":"terasolunaorg","id":2259156,"avatar_url":"https://avatars.githubusercontent.com/u/2259156?v=3","gravatar_id":"","url":"https://api.github.com/users/terasolunaorg","html_url":"https://github.com/terasolunaorg","followers_url":"https://api.github.com/users/terasolunaorg/followers","following_url":"https://api.github.com/users/terasolunaorg/following{/other_user}","gists_url":"https://api.github.com/users/terasolunaorg/gists{/gist_id}","starred_url":"https://api.github.com/users/terasolunaorg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/terasolunaorg/subscriptions","organizations_url":"https://api.github.com/users/terasolunaorg/orgs","repos_url":"https://api.github.com/users/terasolunaorg/repos","events_url":"https://api.github.com/users/terasolunaorg/events{/privacy}","received_events_url":"https://api.github.com/users/terasolunaorg/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/terasolunaorg/guideline","description":"TERASOLUNA Server Framework for Java (5.x)  Development Guideline","fork":false,"url":"https://api.github.com/repos/terasolunaorg/guideline","forks_url":"https://api.github.com/repos/terasolunaorg/guideline/forks","keys_url":"https://api.github.com/repos/terasolunaorg/guideline/keys{/key_id}","collaborators_url":"https://api.github.com/repos/terasolunaorg/guideline/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/terasolunaorg/guideline/teams","hooks_url":"https://api.github.com/repos/terasolunaorg/guideline/hooks","issue_events_url":"https://api.github.com/repos/terasolunaorg/guideline/issues/events{/number}","events_url":"https://api.github.com/repos/terasolunaorg/guideline/events","assignees_url":"https://api.github.com/repos/terasolunaorg/guideline/assignees{/user}","branches_url":"https://api.github.com/repos/terasolunaorg/guideline/branches{/branch}","tags_url":"https://api.github.com/repos/terasolunaorg/guideline/tags","blobs_url":"https://api.github.com/repos/terasolunaorg/guideline/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/terasolunaorg/guideline/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/terasolunaorg/guideline/git/refs{/sha}","trees_url":"https://api.github.com/repos/terasolunaorg/guideline/git/trees{/sha}","statuses_url":"https://api.github.com/repos/terasolunaorg/guideline/statuses/{sha}","languages_url":"https://api.github.com/repos/terasolunaorg/guideline/languages","stargazers_url":"https://api.github.com/repos/terasolunaorg/guideline/stargazers","contributors_url":"https://api.github.com/repos/terasolunaorg/guideline/contributors","subscribers_url":"https://api.github.com/repos/terasolunaorg/guideline/subscribers","subscription_url":"https://api.github.com/repos/terasolunaorg/guideline/subscription","commits_url":"https://api.github.com/repos/terasolunaorg/guideline/commits{/sha}","git_commits_url":"https://api.github.com/repos/terasolunaorg/guideline/git/commits{/sha}","comments_url":"https://api.github.com/repos/terasolunaorg/guideline/comments{/number}","issue_comment_url":"https://api.github.com/repos/terasolunaorg/guideline/issues/comments{/number}","contents_url":"https://api.github.com/repos/terasolunaorg/guideline/contents/{+path}","compare_url":"https://api.github.com/repos/terasolunaorg/guideline/compare/{base}...{head}","merges_url":"https://api.github.com/repos/terasolunaorg/guideline/merges","archive_url":"https://api.github.com/repos/terasolunaorg/guideline/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/terasolunaorg/guideline/downloads","issues_url":"https://api.github.com/repos/terasolunaorg/guideline/issues{/number}","pulls_url":"https://api.github.com/repos/terasolunaorg/guideline/pulls{/number}","milestones_url":"https://api.github.com/repos/terasolunaorg/guideline/milestones{/number}","notifications_url":"https://api.github.com/repos/terasolunaorg/guideline/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/terasolunaorg/guideline/labels{/name}","releases_url":"https://api.github.com/repos/terasolunaorg/guideline/releases{/id}","created_at":"2013-12-17T12:19:55Z","updated_at":"2015-12-27T22:41:12Z","pushed_at":"2015-12-28T09:56:57Z","git_url":"git://github.com/terasolunaorg/guideline.git","ssh_url":"git@github.com:terasolunaorg/guideline.git","clone_url":"https://github.com/terasolunaorg/guideline.git","svn_url":"https://github.com/terasolunaorg/guideline","homepage":"http://terasolunaorg.github.io/guideline/","size":54822,"stargazers_count":41,"watchers_count":41,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":7,"mirror_url":null,"open_issues_count":137,"forks":7,"open_issues":137,"watchers":41,"default_branch":"master"}},"base":{"label":"terasolunaorg:master","ref":"master","sha":"10318dc92501ad99cba98e89f1faf3d377c6ed27","user":{"login":"terasolunaorg","id":2259156,"avatar_url":"https://avatars.githubusercontent.com/u/2259156?v=3","gravatar_id":"","url":"https://api.github.com/users/terasolunaorg","html_url":"https://github.com/terasolunaorg","followers_url":"https://api.github.com/users/terasolunaorg/followers","following_url":"https://api.github.com/users/terasolunaorg/following{/other_user}","gists_url":"https://api.github.com/users/terasolunaorg/gists{/gist_id}","starred_url":"https://api.github.com/users/terasolunaorg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/terasolunaorg/subscriptions","organizations_url":"https://api.github.com/users/terasolunaorg/orgs","repos_url":"https://api.github.com/users/terasolunaorg/repos","events_url":"https://api.github.com/users/terasolunaorg/events{/privacy}","received_events_url":"https://api.github.com/users/terasolunaorg/received_events","type":"Organization","site_admin":false},"repo":{"id":15253684,"name":"guideline","full_name":"terasolunaorg/guideline","owner":{"login":"terasolunaorg","id":2259156,"avatar_url":"https://avatars.githubusercontent.com/u/2259156?v=3","gravatar_id":"","url":"https://api.github.com/users/terasolunaorg","html_url":"https://github.com/terasolunaorg","followers_url":"https://api.github.com/users/terasolunaorg/followers","following_url":"https://api.github.com/users/terasolunaorg/following{/other_user}","gists_url":"https://api.github.com/users/terasolunaorg/gists{/gist_id}","starred_url":"https://api.github.com/users/terasolunaorg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/terasolunaorg/subscriptions","organizations_url":"https://api.github.com/users/terasolunaorg/orgs","repos_url":"https://api.github.com/users/terasolunaorg/repos","events_url":"https://api.github.com/users/terasolunaorg/events{/privacy}","received_events_url":"https://api.github.com/users/terasolunaorg/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/terasolunaorg/guideline","description":"TERASOLUNA Server Framework for Java (5.x)  Development Guideline","fork":false,"url":"https://api.github.com/repos/terasolunaorg/guideline","forks_url":"https://api.github.com/repos/terasolunaorg/guideline/forks","keys_url":"https://api.github.com/repos/terasolunaorg/guideline/keys{/key_id}","collaborators_url":"https://api.github.com/repos/terasolunaorg/guideline/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/terasolunaorg/guideline/teams","hooks_url":"https://api.github.com/repos/terasolunaorg/guideline/hooks","issue_events_url":"https://api.github.com/repos/terasolunaorg/guideline/issues/events{/number}","events_url":"https://api.github.com/repos/terasolunaorg/guideline/events","assignees_url":"https://api.github.com/repos/terasolunaorg/guideline/assignees{/user}","branches_url":"https://api.github.com/repos/terasolunaorg/guideline/branches{/branch}","tags_url":"https://api.github.com/repos/terasolunaorg/guideline/tags","blobs_url":"https://api.github.com/repos/terasolunaorg/guideline/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/terasolunaorg/guideline/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/terasolunaorg/guideline/git/refs{/sha}","trees_url":"https://api.github.com/repos/terasolunaorg/guideline/git/trees{/sha}","statuses_url":"https://api.github.com/repos/terasolunaorg/guideline/statuses/{sha}","languages_url":"https://api.github.com/repos/terasolunaorg/guideline/languages","stargazers_url":"https://api.github.com/repos/terasolunaorg/guideline/stargazers","contributors_url":"https://api.github.com/repos/terasolunaorg/guideline/contributors","subscribers_url":"https://api.github.com/repos/terasolunaorg/guideline/subscribers","subscription_url":"https://api.github.com/repos/terasolunaorg/guideline/subscription","commits_url":"https://api.github.com/repos/terasolunaorg/guideline/commits{/sha}","git_commits_url":"https://api.github.com/repos/terasolunaorg/guideline/git/commits{/sha}","comments_url":"https://api.github.com/repos/terasolunaorg/guideline/comments{/number}","issue_comment_url":"https://api.github.com/repos/terasolunaorg/guideline/issues/comments{/number}","contents_url":"https://api.github.com/repos/terasolunaorg/guideline/contents/{+path}","compare_url":"https://api.github.com/repos/terasolunaorg/guideline/compare/{base}...{head}","merges_url":"https://api.github.com/repos/terasolunaorg/guideline/merges","archive_url":"https://api.github.com/repos/terasolunaorg/guideline/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/terasolunaorg/guideline/downloads","issues_url":"https://api.github.com/repos/terasolunaorg/guideline/issues{/number}","pulls_url":"https://api.github.com/repos/terasolunaorg/guideline/pulls{/number}","milestones_url":"https://api.github.com/repos/terasolunaorg/guideline/milestones{/number}","notifications_url":"https://api.github.com/repos/terasolunaorg/guideline/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/terasolunaorg/guideline/labels{/name}","releases_url":"https://api.github.com/repos/terasolunaorg/guideline/releases{/id}","created_at":"2013-12-17T12:19:55Z","updated_at":"2015-12-27T22:41:12Z","pushed_at":"2015-12-28T09:56:57Z","git_url":"git://github.com/terasolunaorg/guideline.git","ssh_url":"git@github.com:terasolunaorg/guideline.git","clone_url":"https://github.com/terasolunaorg/guideline.git","svn_url":"https://github.com/terasolunaorg/guideline","homepage":"http://terasolunaorg.github.io/guideline/","size":54822,"stargazers_count":41,"watchers_count":41,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":7,"mirror_url":null,"open_issues_count":137,"forks":7,"open_issues":137,"watchers":41,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/terasolunaorg/guideline/pulls/1515"},"html":{"href":"https://github.com/terasolunaorg/guideline/pull/1515"},"issue":{"href":"https://api.github.com/repos/terasolunaorg/guideline/issues/1515"},"comments":{"href":"https://api.github.com/repos/terasolunaorg/guideline/issues/1515/comments"},"review_comments":{"href":"https://api.github.com/repos/terasolunaorg/guideline/pulls/1515/comments"},"review_comment":{"href":"https://api.github.com/repos/terasolunaorg/guideline/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/terasolunaorg/guideline/pulls/1515/commits"},"statuses":{"href":"https://api.github.com/repos/terasolunaorg/guideline/statuses/cab780055833a4a56fa750b9f3ce809f74a28d83"}}}}