セキュリティに関して(自分がわかることを最大限に書いてみる)アプリ

セキュリティに関してなんでも知っているとかではなく、むしろほぼほぼ知識が乏しいのですが、ちょっと前に探したりみてみたりしていた時あまり情報がなかったので、自分が今知っている限りのセキュリティ対策を書いて見ようと思います。むしろ、ここに書くことで今はこうした方がいいんだよとか、それはちょっとみたいなコメントを大いに期待しています！！(｡･ω･｡)

ちなみに以前teratilで質問させて頂いて回答してくださったことが参考になったのでそのURLを貼らさせていただきます。ここで言いたいこともほぼここに含まれていたりします。
https://teratail.com/questions/89023


ちなみにiosのアプリ系の方のお話です。サーバーサイドとの連携との？うまく言えませんが、そんな感じです。

そもそも、セキュリティに関して全てのアプリを全てガチガチにできたら理想だと思いました。
……。
そうでもないみたいです。
そもそもセキュリティを考える際には、どれぐらいその情報を守る必要があるかとのこと。
……。はあーっと言った感じだと思います。

例えば、お国の機密情報、個人のクレジットカード情報、個人の会社名、個人の住所、個人のニックネーム。個人のアカウント。

そもそも、こういう言い方が適切かはわかりませんが、個人の住所など、誰でもよければある程度調べられます。名前も名前を誰にも公開しない人なんていませんから、正直悪用する側もそんなのそこまでと思うかもしれません。

次にクレジットカード情報、これは悪用したい人からするとかなり欲しいものかもしれないので知識をかなり使って取ろうとしたりすると思います。

次にお国情報、そもそも悪用したい人でなく国組織から情報を悪用しようと考えるかもしれません。

何が言いたいかというとその情報の種類により悪用するためにかけられる時間、労力、スキルの度合い、悪用される度合いも異なってくるということです。

さらに、すごく大手の会社がどんなにセキュリティを頑丈にしても、そのセキュリティを破ろうと破ってしまうこともありますから、そもそもセキュリティに完璧もないということ。

<font color="red">そのことを念頭におくとまず考えなけれがいけないことは、どの程度のセキュリティにするかということだと思います。</font>

:star:**で今回自分が思ったセキュリティ対策**:star:


> **・Https通信**
>>
Iosのデフォルトで何もいじらなければそのまま適用されるもの。
※これはアプリからサーバーの方に情報を取得したい時、もらう時に特定の個人情報（トークンや返って来るもの(個人の情報)）を暗号化して通信するというもの。これがされていないと通信した時に特定の人に送った恥ずかしいメッセージ、クレジット番号など丸見えの状態で通信を行うことになる。これはもし仮に悪用する人がこれらの情報を取得できた時、何を表示しているかが丸分かりになるというもの。Httpsはこれらを暗号化することで仮に取られても読めない情報なので悪用できないと言った感じです。
例:Http通信 → 今度7時渋谷でご飯行きませんか？
例:Https通信 → alkldj;aljksnn3r;jdbm,.,b.
みたいな感じですかね？

> **・KeycchainAccessによる保存**
>> 
IOsだと情報を保存する時にUserDefaultsで保存すると思いますが、さらにセキュリティを高めるには、KeycchainAccessによる保存をする方がいいと思いました。ちなみにUserDefaultsはアプリ内への保存、KeycchainAccessはOSへの保存。なのでイメージするなら悪用しようとする前の壁を増やす感じかと思います。もし仮に悪用する人がアプリ内にアクセスできたとします。UserDefaultsでの保存情報は乗っ取られます。それはそのアプリの話です。OSまでいけたとします。アプリでの保存情報以外のOS内に保存されている全ての情報を乗っ取られます。
例:UserDefaultsで保存 → 家の中に侵入された！！
例:KeycchainAccessによる保存 → 家の中の大事な資料がたくさんある隠れ家にまで侵入された！！
イメージはこんな感じですが、私はここで引っかかるのがUserDefaultsはアプリ削除で情報もなくなるがKeycchainAccessはアプリ削除でも情報はなくならない？という不思議感にみまわれ未だ解決はしていないです。
ちなみに、個人で実装のSampleをこころ見ましたが難しく自分には無理そうなので、実装する際はライブラリを使わさせていただこうかと思っています。以下
http://blog.kishikawakatsumi.com/entry/2015/01/03/082916

> **・アクセストークンとリフレッシュトークンを使う、期限をつける**
>> そもそもなぜにアクセストークン、リフレッシュトークンなのか？Apiなどで個人の情報を取得する際にトークンが必要になります。個人の情報を取得するたびに通信の中に大事な大事なトークンを載せます。都度な訳なのでいつでも悪用されるかもしれない通り道にいる訳です。なのでもし仮に悪用されても期限をつけておけば、取られても悪用される時間が限られる、そこで期限の短いアクセストークンが必要になります。では期限の短いアクセストークンの期限が切れた際にまた新しいトークンを作成のために再度ユーザーにログインさせる(アドレスとパスワードを入力させる)のか？いやいや、そこで出て来るのがリフレッシュトークン。いつも危険な道を通るアクセストークンの期限が切れた時だけ通信にリフレッシュトークンを入れて再度新しいアクセストークンとリフレッシュトークンを取得。アクセストークンほどは危険な通信の道を通らないリフレッシュトークン。ですが、これも危険な、いつかわ取られてしまうかもしれない、よってこれにも期限をつけようということです。リフレッシュトークンの期限も切れたらログインからやり直してもらうという感じですかね？

> **・ログイン時の個人へのメール転送**
>> ログインした際に個人にログインしましたよ！！とメールを送るというもの。よくあるあれですよね。もし仮に悪用でログインされてしまった時など、え！！ログインしてないんだけどってアプリ使用者が気づけるかもというお話ですが、そんなのいちいち報告しなくてもいいからとと思う人もいるかもというお話。

> **・パスワード又はメールアドレスの変更時のメール転送**
>> この説明の、上記のログイン時の個人へのメール転送の説明の全く同じなので割愛させていただきます。

> **・自動ログインするかをユーザーに確認する**
>> できれば都度ログイン、ログアウトにした方が、トークンの保持する期間が少なくなり安全性は高くなるので、自動ログインするか毎回ログインするかわ聞いた方が親切な気がします。


:deciduous_tree:**その他**

そのほかに自分の情報が追いついてませんが、個人情報を受けわたす際に証明書を添付してそれを確認するなどもあるみたいです。これには通信の際に証明書を入れるので危険と思ったり、しかし、サーバーでそれを適合するのは確かにセキュリティ高くなりそうと思ったり。

ほかにも気をつけることなどで、アプリに何かしらの通信に必要な際に入れる情報をそのまま記述しないといったこと。ベタガキはそのアプリの中身をもし見られてしまったらその情報は悪用の目に晒されてしまうので、それを難読化させる的な？

クレジットカードや商品購入というものなら、明らかにおかしい方には通知するなどといった対策。


:evergreen_tree:**最後に**

自分の情報が完璧ではないと思いながらと思いながら書かさせて頂いてます。間違えなどありましたらごめんんさい。教えてください。(>ω<)
あとできれば会社などでのセキュリティはそれ専門する業者を通せるのならいいなと思います。その際に任せっきり出なく、自分の知識と照らし合わせたり、情報を増やして応用できたらさらにいいなというのが理想です。