はじめに
こんにちは、@jinta_02と申します。
就職活動の際に、面接で技術質問をされることがあるかと思いますが、普段なんとなく理解しているくらいだと、しっかりと言語化して回答することはかなり難しいことだと思います。私自身も技術質問をされて「すみません、分かりません。」と情けない回答をしてしまったことがあります。そういったことにならないためにも、就活前に改めて確認したい基礎知識について以下にまとめましたので、これから就活をされる方の参考になりますと幸いです。
◾️Web技術
1. RESTfull
【RESTfullとは】
RESTの原則に従って設計されたシステムやサービスのこと。
(RESTfullなシステム、RESTfullなサービスという。)
【RESTの原則とは】
統一インターフェース
あらかじめ定義・共有された方法でで情報がやりとりされる。 Webの場合は、情報の操作はHTTPメソッドが利用されていること。- GET(取得)
- POST(作成)
- PUT(更新)
- DELETE(削除)
アドレス可能性(リソース指向)
システム内のすべてのもの(データやサービス)はリソースとして表現される。これらのリソースは一意な識別子(URI)で参照される。持続性
やりとりされる情報に、別の情報やリンクを含めることができる。ステートレス性
クライアント、サーバー間でのやりとりは1回ごとに完結するため、前のやりとりの結果に影響を受けない。(通信は状態を持たない)2. HTTP
【HTTPとは】
Hypertext Transfer Protocolの略で、 クライアントとサーバー間でHTMLで書かれた文書などの情報をやり取りするときに使われる通信プロトコル のこと。
【HTTPの特徴と動作】
ステートレス性
各リクエストとレスポンスは互いに独立しており、それぞれが前後の通信とは無関係で、状態を保持しない。メソッド
HTTPはいくつかのメソッドを定義していて、- GET(データの取得)
- POST(データの送信)
- PUT(データの更新)
- DELETE(データの削除)
などがある。
ステータスコード
サーバーはリクエストに対する結果として、ステータスコードを返す。ステータスコードはリクエストが成功したかどうかや、エラーが発生したかなどを示すために使用される。主なステータスコード
- 100番台(情報レスポンス):ブラウザによって開始されたリクエストが継続していることを示すコード
- 200番台(成功):ブラウザの要求がサーバーによって受信、理解、処理されたときに返されるコード
- 300番台(リダイレクト):要求されたリソースの代わりに新しいリソースが使用されると、リダイレクトを意味するコードを返す。
- 400番台(クライアントエラー):リクエストに問題があったことを示す。
- 500番台(サーバーエラー):リクエストが受け入れられたものの、サーバー上のエラーによりリクエストの履行が妨げられたことを意味する。
ヘッダー
リクエストやレスポンスには、様々なメタデータを含むヘッダーが含まれる。URL
リソース(ファイルやデータ)は、一意の識別子であるURLを使用して指定される。URLは、プロトコル、ホスト名、ポート番号、パスなどから構成される。3. HTTPS
【HTTPSとは】
Hypertext Transfer Protocol Secureの略で、 HTTPのセキュアなバージョンであり、暗号化通信(SSL/TLS)によってセキュリティを強化したプロトコルのこと。
【SSL/TLSとは】
SSLとは
SSLとは、インターネット上のWebブラウザとWebサーバー間でデータの通信を暗号化し、送受信させる仕組みのこと。TLSとは
TLSとは、SSLの進化バージョンにあたる。ただ、TLSがリリースされたときには、すでにSSLが広く使われていたため、現在は、「TLSのことも含めてSSLと呼ぶ」「SSL/TLS」「TLS/SSL」のような併記で使われることが多い。
【SSL暗号化の流れ】
共通鍵暗号化、公開鍵暗号化の仕組みにより実現しており、
まず、クライアントからリクエストが送られてきたら、サーバー側で証明書と公開鍵をクライアントに送信する。
その後、クライアント側で送られてきた公開鍵を使用して共通鍵を暗号化し、サーバーへ送信する。
これにより、共通鍵を両者で共有することができたため、暗号と復号を行いながら暗号化通信をすることができる。
4. TCP/IP
【TCP/IPとは】
コンピューターネットワークにおける通信プロトコルのセットであり、インターネットを含む広範なネットワークで使用されている。通信を効果的に行うための標準的な手段を提供する。
TCPとは
TCPとは、可能な限り信頼性の高いデータ転送を提供するプロトコル。データはパケットに分割され、それぞれが送信先で再構築される。IPとは
IPとは、パケットのルーティングとデータの転送を担当する。ネットワーク上の異なる危機が通信できるように、各デバイスに一意のIPアドレスを割り当てる。【TCP/IPの階層構造】
アプリケーション層
ネットワークアプリケーションと通信するためのプロトコル(HTTP, FTP, SMTP)が存在する。トランスポート層
データの転送を管理するためのプロトコル。主に、TCPとUDPが使用される。TCPは信頼性の高い接続を提供し、UDPは低レベルの接続で高速な通信を可能にする。インターネット層
データの転送経路を決定するためのIPプロトコルが存在する。ネットワークアクセス層
ネットワークに物理的に接続するためのプロトコルやデバイスドライバが存在する。5. IPアドレス
【IPアドレスとは】
インターネット上のコンピューターを識別する番号のこと。
インターネット上でIPアドレスはたった1つだけであり、世界中で利用できる「住所」のようなもの。
【IPアドレスの表記】
現在は32ビットの数字で表現されるIPv4が主に使用されていて、
「192.168.0.0」のようにピリオドによって4つのブロックに区切った数字の塊で表記される。
【グローバルIPアドレス・プライベートIPアドレス】
グローバルIPアドレス
グローバルIPアドレスは、一意で識別可能なIPアドレス。世界中のインターネットサービスプロバイダ(ISP)によって割り当てられ、グローバルなネットワークにおいて、ユニークである必要がある。プライベートIPアドレス
プライベートIPアドレスは、内部ネットワーク内のデバイスやコンピューターが相互に通信するために使用されるIPアドレス。特定の範囲に属しており、グローバルなインターネット上で一意である必要はない。範囲は、一般的に以下の3つ
- 10.0.0.0 ~ 10.255.255.255
- 172.16.0.0 ~ 172.31.255.255
- 192.168.0.0 ~ 192.168.255.255
【ポート番号】
コンピューターが提供するサービスやプロセスを識別するための16ビットの整数。
※コンピューターを識別するのがIPアドレス
代表的なポート番号
- 80:HTTP
- 443:HTTPS
- 21:FTP
- 25:SMTP
- 22:SSH
- 53:DNS
6. URL
【URLとは】
インターネット上のWebページやファイルの位置や場所を示すもので、「http://example.com/text.html」のような文字列のこと。
通常は省略されているが、「http://example.com:80/text.html」というようにポート番号を指定できる。
【構文】
- スキーム名:「http:」
プロトコルを指定する。 - ホスト名:「example.com」
接続先のサーバーを指定する。IPアドレスで指定することも可能 - ポート番号:「:80」
接続先のサーバーのポート番号を指定できるが、通常は省略されている。 - パス名:「text.html」
接続先のサーバー上のディレクトリやファイルを指定する。
7. ドメイン
【ドメインとは】
IPアドレスを文字列に変換したもので、「https://example.com」の「example.com」の部分にあたる。
数字で表記されるIPアドレスは、人間にとって分かりにくいため、ドメインがIPアドレスの別名として利用されている。
ドメインは、グローバルIPアドレスと同様で一位であり、世界中において同じアドレスは存在しない。
8. DNS
【DNSとは】
ドメインをIPアドレスへと変換する仕組みのこと。
インターネット上のサービスやリソースを特定するために使用され、ユーザーが覚えやすいドメイン名を使ってWebサイトやメールサーバーにアクセスできるようにする。
9. Cookie
【Cookieとは】
Webサイトを閲覧したときに、訪問者が訪れたサイトや入力したデータ、利用環境などの情報が記録されたファイルのこと。
Webサーバー、クライアント間でCookieのやりとりを行うことで、ユーザーを識別できたり、買い物情報を保持できたりする。
【Cookieのやりとり】
Webサーバーへ接続してきたブラウザに対して、コンテンツと一緒にCookie((例)ユーザー情報など)を送る。Cookieを受け取ったブラウザはそれを保存しておき、次にWebサーバーに対して接続する際に、保存しておいたCookieを送信することがで、Webサーバー側で接続してきた相手を識別する。
【メッセージヘッダー】
Cookieの送信には、HTTPリクエスト・レスポンスのメッセージヘッダーが利用される。
HTTPリクエストでは、 「Cookie」ヘッダーを含めることでCookieを送信でき、
HTTPレスポンスでは、 「Set-Cookie」ヘッダーを含めることでCookieを送信できる。
【セッションCookie】
有効期限が設定されていないCookieは、ブラウザが閉じられると同時に解除される。このようなCookieを「セッションCookie」という。
10. セッション
【セッションとは】
Webブラウザとサーバー間のやりとりにおいて、一連の関連性のある処理の流れのことをいう。
例えば、ECサイトで商品を買う場合、「商品を選ぶ」「買い物カゴに入れる」「買い物かごの中身を確認する」「商品を買う」というような処理の流れのこと。
【セッション管理】
セッション管理には、Cookieが使用される。
セッション管理において、Webブラウザを識別するための情報を「セッションID」とよび、これはWebサーバー側で生成され、Cookieに含めてWebブラウザに送信される。「セッションID」を受け取ったWebブラウザは、次回以降、Cookieに「セッションID」を含めて処理を行うことで、Webサーバーとのセッションを維持できる。
◾️プログラミング技術
11. オブジェクト指向
【オブジェクト指向とは】
データや処理を「ある役割を持ったモノ」として捉えることで、これらを組み合わせることで1つプログラムを作る考え方のこと。
【オブジェクト指向で使われる概念】
オブジェクト
直訳すると、「もの」「対象」という意味。オブジェクト指向では、クラスやインスタンスをオブジェクトという。
クラス
オブジェクト指向では、オブジェクト(インスタンス)の設計図に相当するもの。ユーザーモデルや投稿(ポスト)モデルのこと。
インスタンス
クラスから作られた実体のこと。ユーザーモデルから作られた1人のユーザー、投稿モデルから作られた1つの投稿のこと。
メソッド
クラス内で定義された関数のこと。クラスを通じて呼び出されるもの。
【オブジェクト指向の三原則】
継承
「既存のクラスを機能を受け継いだ新しいクラス」を作ること。継承を行うことで、既存のクラスから変数やメソッドを引き継ぐことができる。
継承元のクラスの呼び方
- 親クラス
- スーパークラス
- 基底クラス
継承して作ったクラスの呼び方
- 子クラス
- サブクラス
- 派生クラス
ポリモーフィズム
簡単にいうと、「同じ名前の機能で、全く違う動きをする処理を実装できる」こと。2つの機能
オーバーライド
「継承で引き継いだメソッドを、同じ名前のまま別の処理として上書きできる処理」のこと。例えば、「雑魚敵」クラスで「Attack」メソッドを定義していて、「雑魚敵」クラスを継承して、「ボス敵」クラスを作成すると「Attack」メソッドもそのまま使用できるが、そのままだとボスに対しての攻撃が通じないので、「Attack」という同じ名前のメソッドで、処理(ダメージを多くする)を上書きすることで、ボスに対しても攻撃が効くようにする。
オーバーロード
「同じ名前のメソッドを、引数の型や数に応じてそれぞれ定義することができる機能」カプセル化
「オブジェクトのデータを、クラス外から干渉できないようにする」こと。12. 例外処理
【例外処理とは】
プログラムの実行の継続を妨げる異常な事象(例外)が発生した際に、その内容に応じて実行される処理のこと。
【Railsでの例外処理(例)】
ArticleControlelrの処理で、記事を取得したい場合に、記事が見つからない場合の処理を書いてみる。
class ArticlesController < ApplicationController
def show
@article = Article.find(params[:id])
rescue ActiveRecord::RecordNotFound
flash[:error] = "Article not found"
redirect_to root_path
end
end
説明としては、showアクションで記事を取得する際に、記事が見つからない場合は、ActiveRecord::RecordNotFound例外が発生し、この例外が発生した場合は、フラッシュメッセージにエラーメッセージをセットし、ルートパスにリダイレクトさせる。
13. MVCモデル
【MVCモデルとは】
プログラムの処理を役割ごとに分けるアーキテクチャパターンのことで、3つの主要なコンポーネントに分割する。
【MVCの役割】
Model
Modelは、アプリケーションのビジネスロジックを担当する。データベースからのデータの取得、変更、ビジネスルールの適用などを行う。
View
Viewは、HTMLを元に画面の表示を行ったり、画面に入力された値をコントローラに送ったりする、ユーザーインターフェースを担当する。Controller
ModelとViewの仲介役を担当する。ユーザーからのリクエストを元に、必要であればモデルを経由してデータベースのCRUD処理を行い、モデル経由で受け取ったデータをビューに渡す。
【MVCのメリット】
保守性と拡張性
各コンポーネントが独立しているため、変更や拡張がしやすい。再利用性
モデルやコントローラーを継承することで、再利用ができ、同じコードを書かなくてすむ。14. トランザクション
【トランザクションとは】
結果の整合性が要求される複数の処理を1つにまとめたもの。
(よく銀行振込で例えられるが、A処理(振込元の口座から振込額が減っており、振込先へ送金されていること。)、B処理(振込元より振込額を受け取り、口座の残高が増えていること。)のような、1つの処理が失敗するとデータの整合性が合わないような処理において、これらを1つのまとまりの処理として考えること。)
【Railsでのトランザクション】
複数のSQL文の発行によるデータの更新を「1つの処理」とし、すべてのSQL文の実行が成功したときに、データベースに反映させること。
データの整合性を保つ目的がある。
# 例
class ExampleController < ApplicationController
def some_action
# トランザクションの開始
ActiveRecord::Base.transaction do
# データベースへの変更処理
# 例: ユーザーの作成
user = User.create!(name: 'John Doe')
# 例: 別のモデルの作成
profile = UserProfile.create!(user_id: user.id, bio: 'A little bit about me.')
# データベースへの変更が成功した場合はコミット
# トランザクションが正常に終了すると、変更がデータベースに反映される
# 例外が発生すると、ロールバックされてデータベースへの反映はされなくなる。
end
end
end
【Railsのトランザクションの仕組み】
transactionメソッドに与えられたブロックは、within_new_transactionメソッドというものの中で実行される。
ここで、与えられたブロックで発生した例外をキャッチして、ロールバックを発生させたあと、例外をもう一度送出する。
流れとしては、
- トランザクション内で例外が発生した時点でその例外をキャッチ
- ロールバックされる
- 発生した例外を返す
15. バリデーション
【バリデーションとは】
ユーザーから入力されたデータが、特定の規則や条件を満たしているかを検証するプロセスまたは手法のこと。
【バリデーションの目的】
データの品質向上
正しいデータがシステム内に保存され、処理されることを確保する。セキュリティ向上
不正なデータや攻撃を防ぐために、データが期待される形式にしたがっていることを確認する。ユーザーエクスペリエンス向上
フォームの入力などで、ユーザーに対してエラーを表示して、適切なデータを提供することで、ユーザーエクスペリエンスを向上させる。【Railsでのバリデーション】
class User < ApplicationRecord
# 名前が空でないかを検証する。
validates :name, presence: true
# メールアドレスが一意であるか、また正しい形式かを検証する。
validates :email, presence: true, uniqueness: true, format: { with: /\A\S+@\S+\z/, message: "invalid format" }
# パスワードが8文字以上か検証する。
validates :password, presence: true, length: { minimum: 8 }
end
16. O/Rマッピング
【O/Rマッピングとは】
オブジェクト指向プログラミング言語においてリレーショナルデータベースのレコードを通常のオブジェクトとして操作する方法のこと。
【RailsのO/Rマッパー】
RailsのO/Rマッパーは、「ActiveRecord」であり、データベースのテーブルとrubyのオブジェクトのモデルとを関連付け、操作するための便利なインターフェースを提供する。
(例)Userモデルとusersテーブルを考える
# UserクラスがApplicationRecordを継承しており、これによってActiveRecordが組み込まれている。
# Userモデルがusersテーブルと関連づけられる。
class User < ApplicationRecord
# バリデーションの定義
validates :name, presence: true
validates :email, presence: true, uniqueness: true
end
オブジェクトに対して、以下の記述(メソッド)をすることで、データベースへの操作を行うことができる。
# ユーザーの作成
user = User.create(name: "John Doe", email: "john@example.com")
# ユーザーの検索
found_user = User.find_by(email: "john@example.com")
# ユーザーの更新
found_user.update(name: "John Smith")
# ユーザーの削除
found_user.destroy
◾️Ruby on Rails
17. ActiveRecord
【ActiveRecordとは】
RailsのO/Rマッパーであり、データベースのテーブルとRubyのオブジェクトのモデルとを関連付け、操作するための便利なインターフェースを提供する。
【簡単な例】
(例)Userモデルとusersテーブルを考える
# UserクラスがApplicationRecordを継承しており、これによってActiveRecordが組み込まれている。
# Userモデルがusersテーブルと関連づけられる。
class User < ApplicationRecord
# バリデーションの定義
validates :name, presence: true
validates :email, presence: true, uniqueness: true
end
オブジェクトに対して、以下の記述(メソッド)をすることで、データベースへの操作を行うことができる。
# ユーザーの作成
user = User.create(name: "John Doe", email: "john@example.com")
=> INSERT INTO "users" ("name", "email", "created_at", "updated_at") VALUES ('John Doe', 'john@example.com', '2023-01-01 12:00:00', '2023-01-01 12:00:00')
# ユーザーの検索
found_user = User.find_by(email: "john@example.com")
=> SELECT * FROM "users" WHERE "users"."email" = 'john@example.com' LIMIT 1
# ユーザーの更新
found_user.update(name: "John Smith")
=> UPDATE "users" SET "name" = 'John Smith', "updated_at" = '2023-01-01 12:01:00' WHERE "users"."id" = 1
# ユーザーの削除
found_user.destroy
=> DELETE FROM "users" WHERE "users"."id" = 1
18.StrongParameters
【StrongParametersとは】
リクエストからのパラメータの扱いを制限し、許可されたパラメータのみを受け入れることで、不正な入力データによる攻撃や、意図しないデータ変更からアプリケーションを守る手段のこと。
【マスアサインメントの脆弱性】
下記のように複数のカラムを一括で指定できる機能を「マスアサインメント」というが、これには脆弱性がある。
User.new(name: 'nakamura', age: 29)
Railsでは、「params」を使用して、ユーザーからのリクエストを受け取ることができるが、例えば、Userクラスに'name', 'email', 'admin'のカラムが存在していた時に、ユーザーが悪意に、「role: 'admin'」として、パラメータを送ってきたら、そのユーザーが管理者として登録されてしまう。
use = User.new(params[:user])
user.save
このような事態を防ぐために、「StrongParameters」がある。
【簡単な例】
Railsのコントローラでは、リクエストからのパラメータを取得するために「params」ハッシュが使用される。
StrongParametersは、この「params」ハッシュ内の許可されたパラメータのみを選別して取り扱う。
(例)Userモデルに対して、'name', 'email'のみを許可する場合
class UsersController < ApplicationController
def create
# パラメータを受け入れる際にストロングパラメータを使用
@user = User.new(user_params)
if @user.save
# 保存成功時の処理
else
# 保存失敗時の処理
end
end
private
# ストロングパラメータを定義
def user_params
params.require(:user).permit(:name, :email)
end
end
「user_params」メソッド内で、'name', 'email'のみを許可しているため、それ以外のパラメータが渡されることを防いでいる。
19. N+1問題
【N+1問題とは】
必要以上にデータベースのクエリが発行されてしまう問題のことで、アプリケーションのパフォーマンスの低下を招く。
主にオブジェクト指向のORM(Object-Relational Mapping)を使用するアプリケーションで発生する。
【問題が発生する例】
UserモデルとPostモデルがあり、以下の関連付けが行われている。
class User < ApplicationRecord
has_many :posts
end
class Post < ApplicationRecord
belongs_to :user
end
そして、コントローラでUserモデルのリストをすべて取得し、ビュー側でユーザーに関連するポストの数を表示する。
class UsersController < ApplicationController
def index
@users = User.all
end
end
<% @users.each do |user| %>
<p><%= user.name %> has <%= user.posts.count %> posts.</p>
<% end %>
上記のような記述をした場合に「user.posts.count」の部分で、各ユーザーごとに別々のクエリが発行されるため、必要以上にクエリが発行されてN+1問題が起きてしまう。
ユーザー数がNであれば、合計で、N+1回のクエリが発行されてしまうため、「N+1」問題と言われている。
【解決策】
下記のように、「includes」メソッドを使用して、Userモデルとそれに関連するPostモデルのデータを一度のクエリで取得することで、N+1問題を解決する。
class UsersController < ApplicationController
def index
@users = User.includes(:posts).all
end
end
20. クラスメソッド
【クラスメソッドとは】
クラス自体に対して操作を行う場合や、クラスに関連する処理を提供するために使用されるメソッドのこと。
【簡単な例】
Userモデルに対して、特定の条件に基づいたユーザーを取得するクラスメソッドを定義してみる。
class User < ApplicationRecord
def self.active_users
where(active: true)
end
end
$ User.active_users
=> # activeカラムがtrueのユーザーのみ表示される。
21. インスタンスメソッド
【インスタンスメソッドとは】
特定のクラスのインスタンス(オブジェクト)に対して呼び出され、そのインスタンスの状態を変更したり、操作したりするメソッドのこと。
【簡単な例】
Userモデルのインスタンスに対して、フォーマットを指定して文字列を出力させるインスタンスメソッドを定義してみる。
class User < ApplicationRecord
# インスタンスメソッド: ユーザーのプロフィールをフォーマットして表示
def formatted_profile
"Name: #{name}, Email: #{email}, Age: #{age}"
end
end
# インスタンスの生成
[1] user = User.create(name: "John Doe", email: "john@example.com", age: 25)
# インスタンスメソッドの呼び出し
user.formatted_profile
=> "Name: Jogn Doe, Email: john@example.com, Age: 25"
22. コールバック
【コールバックとは】
特定のアクションやイベントが発生した際に、自動的に呼び出されるメソッドのこと。
モデルやコントローラなどのクラス内で定義され、主にデータベースのレコードの保存、更新、削除などのタイミングで実行される。
【コールバックの種類】
1. オブジェクトの作成(create, save)
- before_validation
- after_validation
- before_save
- aroung_save
- before_create
- around_create
- after_create
- after_save
- after_commit
- after_rollback
2. オブジェクトの更新(update)
- before_validation
- after_validation
- before_save
- around_save
- before_update
- around_update
- after_update
- after_save
- after_commit
- after_rollback
3. オブジェクトの削除(destroy)
- before_destroy
- around_destroy
- after_destroy
- after_commit
- after_rollback
【簡単な例】
Commentのインスタンスが作成される前に、Commentのbodyの中に不適切なワードが含まれていないかを確認して、不適切なワードが含まれていれば、コメントを非表示にする。
class Comment < ApplicationRecord
before_create :check_for_profanity
def check_for_profanity
profane_words = ['ばか', 'アホ']
if profane_words.any? { |word| body.include?(word) }
self.visible = false
end
end
end
23. Gemfile
【Gemfileとは】
Rubyアプリケーションの依存関係(Gem)を管理するための設定ファイルのこと。
使用するGemやそのバージョン、必要なグループ(development, test, production)などが記述されている。
source "https://rubygems.org"
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
ruby "3.2.2"
gem "rails", "~> 7.0.6"
group :development, :test do
gem "debug", platforms: %i[mri mingw x64_mingw]
gem 'rubocop', require: false
gem 'rubocop-rails', require: false
# test
gem 'capybara'
gem 'factory_bot_rails'
gem 'rspec-rails'
gem 'webdrivers'
end
【Gemfile.lockとは】
依存関係にあるgemも含め、bundlerによってインストールされたすべてのgemとそのgemのバージョンが記載されたファイルのこと。
24. concern
【concernとは】
モデルやコントローラーで共通の処理がある場合に、その処理を切り出して定義することができる機能であり、必要な箇所で「include」することで使用できるもの。
【簡単な例】
ブログアプリで、記事(Postモデル)とコメント(Comment)がある場合で、これらのモデルに「いいね」機能を実装したいとする。この「いいね」機能を実装する処理を、concernを使用して定義する。
module Likeable
extend ActiveSupport::Concern
included do
has_many :likes, as: :likeable
end
# いいねを付ける
def like(user)
likes.create(user: user)
end
# いいねを外す
def unlike(user)
likes.find_by(user: user)&.destroy
end
end
定義した、LikeableモジュールをPostモデルとCommentモデルに組み込む。
class Post < ApplicationRecord
include Likeable
end
class Comment < ApplicationRecord
include Likeable
end
いいねを作成してみる。
[1] user = User.find(1)
[2] post = Post.find(1)
[3] comment = Comment.find(1)
[4] post.like(user)
=> いいねを追加
[5] post.unlike(user)
=< いいねを外す
[6] comment.like(user)
=> いいねを追加
[7] comment.unlike(user)
=< いいねを外す
◾️セキュリティ
25. XSS(クロスサイトスクリプティング)
【XSSとは】
Webサイトの脆弱性を利用し、記述言語であるHTMLに悪質なスクリプトを埋め込む攻撃のこと。
「Cross Site Scripting」の略称として、「XSS」と呼ばれている。
アンケートサイトやサイト内検索、ブログ、掲示板などユーザーからの入力内容をもとにWebページを生成するサイトなどが攻撃の対象になりやすい。
【攻撃の流れ】
- 攻撃者は、入力フォームにスクリプト付きのリンクを含む内容を入力して、Webアプリに罠を仕掛ける。(掲示板サイトなど)
- 訪問者が該当のWebアプリを利用
- リンクをクリックしてスクリプトが実行されると、別のWebサイトに遷移(クロス)し、悪意のある内容(スクリプト)が実行される。
- その結果、マルウェア感染などを引き起こす。
【XSS対策】
サニタイジング(スクリプトの無害化)
サニタイジングされていないWebアプリで、を含む内容が投稿された場合、投稿内容にリンクボタンが作成されてしまう。なので、スクリプト構成に必要な「&」「<」「>」「"」「'」などに着目し、これらの文字列がそのまま表示されるように置換(エスケープ)し、スクリプトの無害化(サニタイジング)を行うことが必要。
入力値の制限
ユーザーの入力できる値を制限する。例えば、郵便番号の入力欄では、数字以外の入力を許可しないことで、スクリプトを入力できないようにする。
WAFで防御
WAFとは、「Web Application Fireewall」の略称で、Webアプリケーションをサイバー攻撃から守るツールのこと。 WAF(Web Application Firewall)を導入することで、サイバー攻撃からWebアプリケーションを守る。【RailsのXSS対策】
Railsでは、ビューに表示するデータに対して、自動的にHTMLエスケープ処理を行うことで、XSS攻撃を防いでいる。
ユーザーが入力した値は、以下のような形でビューに書くことが多いが、「<%= %>」が自動的にエスケープ処理を行なってくれている。
<%= @user.comments %>
具体的には、以下のとおりに変換してくれている。
- < を <
- > を >
- & を &
- " を "
- ' を '
# エスケープの例
@user.comments = '<script>alert(\'XSS\')</script>'
<script>alert('XSS')</script>
26. CSRF(クロスサイトリクエストフォージェリ)
【CSRFとは】
Webアプリケーションへのリクエストを偽造(フォージェリ)され、ユーザーの意図しない処理が実行されてしまうこと。
CSRFの脆弱性は、ECサイトでの物品購入や会員制サイトでのパスワード変更、SNSへの投稿など、リクエスト送信者がユーザー本人か否かを確認すべき処理で発生する。
【攻撃の流れ】
- ユーザーが正規のサイトにログインする。
- ログインした状態のユーザーが、攻撃者によって作られた罠サイトを閲覧する。
- 罠サイトに仕組まれたJavaScriptにより、正規のWebアプリケーションのサーバーに対して、「ユーザーパスワードを変更してください。」というリクエストが送信される。
- 正規のアプリケーションにてユーザーのパスワードが変更される。
攻撃の中で、「正規のサイト」と「罠サイト」の2つのサイトをまたいで(クロス・サイト)、リクエストを偽造する(リクエスト・フォージェリ)点が、特徴である。
【CSRF対策】
トークンの利用
重要な処理の実行に際して、本人しか知り得ない秘密情報が含まれていることの確認を持って処理を通すことで、第三者によるリクエストの偽造を防ぐことができる。【RailsでのCSRF対策】
CSRFトークン
Railsでは、フォームの作成に「form_with」を使用することで、フォームを送信する際に自動的にCSRFトークンが生成され、フォームに含まれるようになっている。サーバー側でこのトークンを検証し、正しくない場合はリクエストを拒否する。
<%= form_with(model: @post) do |form| %>
<%= form.text_field :title %>
<%= form.text_area :content %>
<%= form.submit %>
<% end %>
AjaxリクエストにおけるCSRF対策
Ajaxリクエストを行う場合も、CSRFトークンを正しく扱う必要があるが、Railsでは、「csrf_meta_tags」ヘルパーによって、CSRFトークンをメタタグとして取得できる。このトークンはAjaxリクエストのヘッダーに含めて送信される。
<!DOCTYPE html>
<html>
<head>
<%= csrf_meta_tags %>
</head>
<body>
<!-- ページのコンテンツ -->
</body>
</html>
27. SQLインジェクション
【SQLインジェクションとは】
第三者がSQLクエリを悪用してデータベースへ不正にアクセスし、情報を搾取や改ざん、削除する攻撃のこと。
【攻撃の流れ】
(例)ユーザーログイン
- 入力フォームなどに以下のフォームが入力される。
SELECT * FROM users WHERE username = '' OR '1'='1'; --' AND password = 'パスワード';
- 全てが真になるためパスワードの検証などが無視される。
' OR '1'='1'; --
【RailsでのSQLインジェクション対策】
ActiveRecordの使用
下記のように、ActiveRecordを使用することでSQLインジェクションのリスクを低減できる。
User.where(name: name, password: password)
プレースホルダーの使用
ActiveRecordクエリメソッドでは、ユーザーからの入力を直接埋め込むのではなく、プレースホルダーを使用してパラメータを渡すことが推奨されている。これにより、適切にエスケープされSQLインジェクションを防ぐことができる。# プレースホルダーを使用してパラメータを渡す
User.where("username = ? AND password = ?", username, password)
◾️開発手法
28. ウォータフォール開発
【ウォーターフォール開発とは】
システムやソフトウェア開発で用いられる開発手法の一つ。
「滝(Waterfall)」のよう落下するが如く開発が進むことから、名付けられている。
【開発の流れ】
上から順番に行っていく。
要件定義
システムの機能や、開発に必要な予算や人員を決める。外部設計
ユーザーインターフェースを設計する。内部設計
システムの内部の動作や機能、物理データー部分を設計する。実装
外部設計と内部設計に基づいて、実装する。単体テスト
実装したプログラムが正しく機能するかテストする。統合テスト
複数のプログラムを組み合わせ、正しく機能するかテストする。運用テスト
完成したシステムが、実際の業務に使用できるかテストする。リリース
テストが完了したシステムをリリースする。29. アジャイル開発
【アジャイル開発とは】
「計画→設計→実装→テスト」といった開発工程を機能単位の小さいサイクルで繰り返す開発手法のこと。
「プロジェクトに変化はつきもの」という前提で進められるので、仕様変更に強く、プロダクトの価値を最大化することに重点を置いている。
【アジャイル開発の手法】
スクラム
【スクラムとは】
スクラムとは、アジャイル開発のフレームワークの1つで、開発チームが柔軟で迅速に価値あるソフトウェアを提供するための手法。
スクラムは、単一のプロジェクトや製品開発のフェーズだけでなく、組織全体に適用することもできる。
【スクラムの特徴】
イテレーションとインクリメンタルな開発
短い期間(2〜4週間)で機能の一部を開発し、その間に検証やフィードバックを得るイテレーションを行う。これにより、ソフトウェアは徐々に機能していくインクリメンタルな進化をする。
プロダクトバックログ
開発する機能や要件を優先順位付けしたリストのこと。プロダクトバックログは、プロジェクトの進行に応じて変更され、新しい用件が追加されたり既存の用件が優先度を変更したりする。
スクラムチーム
開発に関わるすべての活動を担当するチームのこと。スクラムマスター
チームがスクラムの原則とプラクティスを理解し、遵守できるようにサポートする役割を持つ。障害の解決やプロセスの最適化を促進する。
プロダクトオーナー
プロダクトバックログを管理し、チームに対して優先順位を伝える役割を持つ。ビジネスの視点からプロジェクトに関与する。
デイリースクラム
チームは毎日、短い会議であるデイリースクラムを行う。各メンバーの進捗、課題、予定を把握する。
30. DevOps
【DevOpsとは】
「開発(Development)」「運用(Operations)」を組み合わせた造語で、開発担当と運用担当が緊密に連携して、柔軟かつスピーディにシステム開発を行う手法のこと。
◾️最後に
今回まとめたことで、理解が深まった部分もあったのでまとめてみて良かったなと感じました。
あとは、面接の場で簡潔にわかりやすく説明する練習をするだけですね。(これが1番難しいですが。)
最後まで見ていただきありがとうございました!
一旦、30選としましたが、時間のある時に更新していければと考えております。
また、間違い等につきましてはご指摘いただけますと幸いです🙇♂️