🌳
面接で聞かれた技術的質問🚀
初めまして、最近、転職活動をしているバックエンドエンジニアです。
面接の場面で、技術的質問を受ける経験がよくあるのですが
声に出すと中々説明出来なかったので、自身の振り返りも込めて質問内容を大雑把にまとめようと思います。
内容は、ネットワーク、セキュリティ、データベースに関してです。
ネットワーク🌼
ブラウザであるURLを叩いて、ページが表示されるまでの流れを教えてください
- DNSサーバーにアクセスし、ドメインに紐付けされたIPアドレスの取得。
- 取得したIPアドレスを元に、ブラウザからリクエストが送信される。
- リクエストを受信したサーバーが、データパケットという形でレスポンスが返却し、Webサイトの情報がブラウザに表示される
Cookieとは何か?また、どのような場面で使用されるかを教えてください
Cookieとは
- ウェブブラウザに保存された情報。
どのような場面で使用される?
- ユーザ識別やセッション管理を実現する目的などに利用される。
- 代表例として挙げられるのは、ショッピングサイトにおけるカートやログイン状態の管理。
- IPアドレスに寄らないクライアントの識別を可能にするため、ウェブサイト運営者やインターネット広告配信業者などがユーザの詳細なアクセス履歴を取得する用途にも使われる。
TCP/UDPの違いについて教えてください
TCP (Transmission Control Protocol)
- 高信頼性(3wayハンドシェイクによる通信前の打診、ackによる相手の受信確認や再送処理、等)や通信効率の最適化機能(Windowによるフロー制御や輻輳制御)を提供。
- そのため、UDPと比べて負荷がかかります。
UDP (User Datagram Protocol)
- コネクションレス型のプロトコルであることから、TCPに比べると信頼性がないものの高速に転送を行うことができる
- また、UDPヘッダサイズ(8byte)が少ない事から、その分アプリケーションのデータを多く送受信することができます。
- ただし、パケットが到達する保証がないことから、パケットロスなどの場合アプリケーション側で再送処理をして通信を成立させるかパケットロスが容認できるアプリである必要があります。
ステータスコード(200,300,400,500台)それぞれの意味を教えてください
200 成功レスポンス
- 200 OK
- リクエストが成功。成功が意味することは、HTTPメソッドにより異なる。
- 201 Created
- リクエストが成功し、新たにリソースが追加されたことを示す。
- 204 No Content
- リクエストに対して、送信するコンテンツは無いが、ヘッダーが有用であることを示す。
300 リダイレクト
- 301 Move Permanently
- リクエストされたリソースのURLが永遠に変更されたことを示す。レスポンスで新しいURLが付与される。
- 302 Found
- リクエストされたリソースのURIが一時的に変更されたことを示す。URIは将来、さらに変更される可能性があります。従って、クライアントは将来のリクエストでも同じURIを使用するべきである。
400 クライアントエラー
- 400 Bad Request
- 構文が無効であるため、サーバーがリクエストを理解できないことを示す。
- 401 Unauthorized
- クライアントは、リクエストされたレスポンスを得るためには認証を受けなければならない。
- 403 Forbidden
- 認証されていないなどの理由でクライアントにコンテンツのアクセス権がなく、サーバーが適切なレスポンスの返信を拒否していることを示す。401とは異なり、クライアントの識別子がサーバーに知らされている。
- 404 Not Found
- サーバーがリクエストされたリソースを発見できないことを示す。
500 サーバーエラー
- 500 Internal Server Error
- サーバー側で処理方法がわからない事態が発生したことを示す。
- 502 Bad Gateway
- リクエストの処理に必要なレスポンスを受け取るゲートウェイとして動作するサーバーが無効なレスポンスを返すことを示す。
- 503 Service Unavailable
- サーバーがリクエストを処理する準備が出来ていないことを示す。
- 一般的な原因は、サーバーがメンテナンスや過負荷でダウンしていること。
- このレスポンスとともに問題について説明する、ユーザーにわかりやすいページを送信するべきであることに注意。
- このレスポンスは一時的な状況について使用するものであり、また可能であれば、サービスが復旧する前に Retry-After: HTTP ヘッダーに予定時刻を含めるべきである。
- また、これら一時的な状況のレスポンスは通常キャッシュされるべきではないことから、ウェブ管理者はこのレスポンスとともに送られるキャッシュ関連のヘッダーに注意しなければならない。
- 504 Gateway Timeout
- ゲートウェイとして動作するサーバーが時間内にレスポンスを得られない場合に送られる。
セキュリティ🔥
DoS(DDoS)とは何か?また、対策方法を教えてください
DoS(Denial of Service attack/サービス拒否攻撃)
ウェブサイトやサーバーに対して過剰なアクセスやデータを送付するサイバー攻撃。
DDoS(Distributed Denial of Service attack/分散型サービス拒否攻撃)
Dosを対象のウェブサイトやサーバーに対して、複数のコンピューターから大量に行うこと。
対策方法
- ⭐️ DDoS対策サービスの利用
- IDS(不正侵入検知システム)
- 不正な通信やアクセスがあった場合、それを検知して管理者に通知する
- IPS(不正侵入防止システム)
- サーバーやOSへの通信を監視し、不正な通信やアクセスがあった場合にブロックする
- WAF(Web Application Firewall)
- Webアプリケーションに対する通信を監視し、不正な通信やアクセスがあった場合にブロックする
- CDN(コンテンツデリバリーネットワーク)
- サイトのレスポンス(画面表示など)を早くするための仕組み。
- CDNを使うと、ユーザーからもっとも近いキャッシュサーバーにアクセスするため、大量アクセスがあっても本体のサーバーに被害が起きない
- IDS(不正侵入検知システム)
- 攻撃元のIPアドレスを特定して、そのIPアドレスのアクセスを遮断する。(DDoSには効果が少ない)
- サイバー攻撃の主流は、海外からのものが多いため、海外からのアクセスを遮断する。(国内からの攻撃には効果がない)
XSSとは何か?また、対策方法を教えてください
XSS (クロスサイトスクリプティング)
- ユーザーがWebページにアクセスすることで不正なスクリプトが実行されてしまう脆弱性または攻撃手法
- 被害の代表例としては、攻撃者による不正ログインが挙げられる
対策方法
- Webページに出力するデータのサニタイジング
CSRFとは何か?また、対策方法を教えてください
CSRF (クロスサイトリクエストフォージェリ)
- Webアプリケーション利用者自身が意図しない処理が実行されてしまう脆弱性または攻撃手法
- 被害の代表例としては、使用者の意図しないWebアプリケーション上の処理実行が挙げられる
対策方法
- リクエストの送信元を確認する仕組みが必要。
- セッションCookieには常にSameSite属性を使用する
- サーバーが最初にCookieを発行する際にSameSite属性を指定しておけば、ドメインを跨いだ(クロスドメイン)リクエストにそのクッキーをセットさせないことが可能になる。
- リファラーヘッダーまたはオリジンを確認する
- リファラーヘッダーとは、遷移元のウェブページのアドレスが含まれているヘッダー情報になる。
これにより、サーバはリクエストがどこから来たかを識別し、分析・ログ・キャッシュの最適化などに利用することができる。
- リファラーヘッダーとは、遷移元のウェブページのアドレスが含まれているヘッダー情報になる。
- ユーザーインタラクションベースの保護を実装する
- 再認証(パスワード以上)、ワンタイムトークン、CAPTCHAなどのユーザーが特定の操作を行なったとき、システムがその操作に応じた反応を返す処理を実装しましょう。
これにより、CSRFからの強力な防御を可能にすることができる。
- 再認証(パスワード以上)、ワンタイムトークン、CAPTCHAなどのユーザーが特定の操作を行なったとき、システムがその操作に応じた反応を返す処理を実装しましょう。
- セッションCookieには常にSameSite属性を使用する
SQLインジェクションとは何か?また、対策方法を教えてください
SQLインジェクション
- データベースを不正に操作されてしまう脆弱性または攻撃手法
対策方法
- プレースホルダ、バインド変数の利用したエスケープ処理
- ウェブアプリケーションに渡されるパラメータにSQL文を直接指定しない
- SQL文の組み立てを文字列連結により行う場合は、エスケープ処理等を行うデータベースエンジンのAPIを用いて、SQL文のリテラルを正しく構成する。
データベース🤖
トランザクションとは何か?
- データベースをある一貫した状態から別の一貫した状態へ変更するアクションを1つに束ねたものである
- 既知の一貫した状態のデータベースを維持するよう設計されており、相互依存のある複数の操作が全て完了するか、全てキャンセルされることを保証する。
インデックスとは何か?また、メリット、デメリットを教えてください
インデックス
- レコードを高速に検索するための仕組み。
- 実際のデータが格納されたテーブルとは別に,インデックス・テーブルと呼ぶテーブルを作成し,それを使ってレコードを検索する。
- インデックス・テーブルは、検索対象となるデータを格納したフィールドと,そのデータが実際のテーブルでどの位置にあるかを示す値を格納したフィールドで構成される。
メリット
- データベーステーブルにアクセスするたびにデータベーステーブルのすべての行を検索しなくても、データをすばやく見つけることが出来る。
デメリット
- テーブルの更新・削除などを行うたびにインデックス・テーブルも対応してデータの更新を逐一行わないといけないので、インデックスを張りすぎるとその分やらないといけない処理が多くなる。
- インデックスの分だけデータの大きさが大きくなる
インデックスが効かないケースについて教えてください
- 万単位のレコード、10~5%程度の該当率でないとインデックスは効かない
- カーディナリティ(一意性)が十分でないとインデックスは効かない
- テストによる大量のINSERTやUPDATEなどで統計情報が現実に即していないと効かない、この場合は統計情報をリセットする
- LIKE(中間一致、後方一致)
- OR
- インデックスに対する処理
- 演算
- IS NULL
- 関数処理(REPLACE、MAXなど)
- 否定形
インデックスが効いてるか確認する方法を教えてください
- SQLのコマンド
- INFORMATION_SCHEMA.STATISTICSテーブルを参照する
- show index from テーブル名;
- EXPLAIN
- クライアントツール
- MySQLであれば、MySQL WorkBench, Sequel Ace など
まとめ
インデックスについては、そもそも答えれない質問もあったので、良い振り返りになったと思います。
参考記事
Discussion
勉強し直します!汗