タグ

ブックマーク / christina04.hatenablog.com (13)

  • remote_addrとかx-forwarded-forとかx-real-ipとか - Carpe Diem

    背景 ECSでNginxのコンテナをプロキシとして立てたところ、APIサーバのアクセスログのクライアントIPがNginxのコンテナIPになっていたのでその修正をしたのがきっかけです。 環境 Nginx 1.10.2 Docker1.12.1 構成 Client -> ELB -> Nginx -> API という構成とします。 ネットでよく見る情報 set_real_ip_from 172.31.0.0/16; real_ip_header X-Forwarded-For; を追加する、とか proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; を追加する、とかどれがどれだか分かりにくいので1つ1つ説明していきます。 用語説明 remote_

    remote_addrとかx-forwarded-forとかx-real-ipとか - Carpe Diem
  • セキュアなトークン管理方法 - Carpe Diem

    概要 クライアント↔サーバ間の認証・認可情報としてのトークン管理はWebサービスとしては必ずつきまとうものですが、一方できちんと実装しないとセキュアに管理はできません。 今回はそのトークン管理方法の一例を紹介します。 要件 今回の主な要件は以下です。 AuthサーバとResourceサーバは別で管理する(負荷特性が異なるので) 認証するとAuthサーバはrefresh tokenとaccess tokenを返す access tokenはJWT形式 access tokenはクライアントのオンメモリで管理する access tokenの期限は短く(1時間以内) refresh tokenを使ってaccess tokenを発行できる refresh tokenはrevoke可能である 認証情報に変更があれば(パスワード変更など)refresh tokenをrevokeできる Resource

    セキュアなトークン管理方法 - Carpe Diem
  • JWTの署名検証で使う公開鍵をX.509証明書で管理する - Carpe Diem

    概要 JWTをアクセストークンとして利用する場合、署名(秘密鍵)は認証サーバで、署名検証(公開鍵)はリソースサーバで行うのが良いです。 そのため認証サーバは公開鍵をリソースサーバに公開する必要があります。 Googleなどの大規模サービスを見ると、生の公開鍵を公開しているのではなくX.509証明書の形で公開されています。 これは 公開鍵の有効期間が設定できる 公開鍵が改ざんされていない事が分かる なりすましによる公開鍵でないことが分かる 秘密鍵が漏洩した時に失効ができる といったデジタル署名のメリットを享受できるようにと考えられます。 { "4e00e8fe5f2c88cf0c7044f307f7e739788e4f1e": "-----BEGIN CERTIFICATE-----\nMIIDHDCCAgSgAwIBAgIILnkHftPtFMYwDQYJKoZIhvcNAQEFBQAwM

    JWTの署名検証で使う公開鍵をX.509証明書で管理する - Carpe Diem
  • Goのnet/httpのtimeoutについて - Carpe Diem

    概要 タイムアウトと一口に言ってもサーバ・クライアント、そして各フェーズによって細かく設定があります。 今回はGonet/httpのtimeoutについて1つ1つ説明していきます。 環境 golang/go 1.13 Server 全体図 サーバ系timeoutと各フェーズは以下の関係になっています。 各項目 項目 役割 http.Server.ReadHeaderTimeout request headersを読む際のtimeout http.Server.ReadTimeout request headersやrequest bodyを読む際のtimeout。 SetReadDeadline()を呼び出してセットする。 http.Server.WriteTimeout request bodyの読み込み〜responseの書き込みまで。 SetWriteDeadline()を呼び出し

    Goのnet/httpのtimeoutについて - Carpe Diem
  • ip netnsコマンドで学ぶNetwork Namespace - Carpe Diem

    概要 Linuxには名前空間(Namespace)というカーネルの機能が提供されています。 これは1つのプロセスが1つのリソースセットを参照し、別のプロセスが異なるリソースセットを参照するようにカーネルリソースを分割する機能です。 その中の1つであるネットワーク名前空間(Network Namespace)の機能を学んでみます。 環境 Ubuntu 18.04 ip netnsを使ってみる 初期状態 デフォルトのUbuntuでは以下のように2つのNICが存在します。 lo enp0s3 コマンドで確認します。 $ ip l 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:0

    ip netnsコマンドで学ぶNetwork Namespace - Carpe Diem
  • http clientでHTTP/2を使う方法 - Carpe Diem

    背景 外部APIを叩く時に利用するhttp clientですが、サーバ側がHTTP/2対応しているのであればコネクションの有効活用ができるようHTTP/2を使いたいものです。 その際にhttp client側で設定する点、気をつける点を説明していきます。 環境 Go 1.15.6 curl 7.64.1 HTTP/2対応しているか確認する方法 まずは対象とするサーバやhttp clientがHTTP/2対応になっているかを確認する方法を紹介します。 サーバ側の確認 サーバ側が対応しているかどうかはcurlの-vオプションで手軽に確認できます。 $ curl -v https://google.com * Trying 2404:6800:4004:809::200e... * TCP_NODELAY set * Connected to google.com (2404:6800:4004

    http clientでHTTP/2を使う方法 - Carpe Diem
    delegate
    delegate 2023/04/12
    [http/2]
  • GoでDependency Injection - Carpe Diem

    概要 「Dependency Injection=依存性の注入」と言われますが、依存したオブジェクトを外部から入れることで何がメリットなのかを感じ取るのは実際に書いてみて分かると思うので、勉強としてまとめてみました。 Dependency Injectionとは デザインパターン 「依存性の注入」ではなく「依存するオブジェクトを注入」 DIコンテナとは別。デザインパターンなのでどの言語でもできる A dependency is an object that can be used (a service). An injection is the passing of a dependency to a dependent object (a client) that would use it. The service is made part of the client's state.[

    GoでDependency Injection - Carpe Diem
  • 負荷が低いのにアクセスを捌けきれない時の対応 - Carpe Diem

    概要 MongoDBCPU使用率やロードアベレージが高くないのに処理が詰まっている現象が起きました。 その時間にbatchが動いていてアクセスが急に増えることが原因と言うのは分かっているのですが、負荷的には十分余裕があり不思議な状態でした。 そこでdstatで見るポイント - Carpe Diemでも述べたように、負荷の状態から判断する基準があります。 ロードアベレージを確認する 1が高ければCPU、ディスクI/O、メモリにボトルネックがある 1が低ければTCPコネクションにボトルネックがある 今回の現象から判断するに、TCPコネクションに原因がありそうです。 原因調査 Too many open filesは出ているか ファイルディスクリプタが足りない場合はコネクション数が足りずに処理が詰まってしまいます。 そしてその場合Too many open filesというエラーが出ます。 し

    負荷が低いのにアクセスを捌けきれない時の対応 - Carpe Diem
  • 様々なrate limitアルゴリズム - Carpe Diem

    概要 インターネットに晒されているWebサービスでは TV等で紹介されたことによる大量流入 悪意ある人物からの攻撃 クライアントのバグに依る大量リクエスト など、来想定していた以上のトラフィックが来ることはよくあります。 単純にシステムを構築すると大規模トラフィックに対応できずシステムがスローダウンしてしまうため、何かしらrate limitをかけておいた方が良いです。 ただしrate limitと一口に入っても色々あるため、今回は主なrate limitアルゴリズムを紹介します。 Leaky bucket Leaky bucketはデータ転送レートを一定にする(=上限を設定する)アルゴリズムです。 下の図のように、様々な流量の水流がそのバケツに流れ込んでも小さな穴からは一定の水流が流れ出す仕組みです。 ref: What is the difference between token

    様々なrate limitアルゴリズム - Carpe Diem
  • ブラウザのキャッシュ - Carpe Diem

    概要 Webフロントのパフォーマンス診断 - Carpe Diem で指摘されたブラウザキャッシュの対応をするため調べてみました。 大きく分けて強いキャッシュと弱いキャッシュの2種類のキャッシュがあります。 強いキャッシュ ブラウザ側でリソースを保持し、期限が切れるまでサーバにHTTPリクエストを発行しません。 なので一度ブラウザにキャッシュされるとサーバ側からハンドリングすることができなくなります。 これを設定する方法は Cache-Controlヘッダー Expiresヘッダー の2つがあります。 Cache-Control: max-age サーバからのレスポンスで以下のようにCache-Controlヘッダーを付けます。 Cache-Control: max-age=3600 このヘッダーが付いたリソースはブラウザ上では強いキャッシュとして残ります。 max-ageは秒数なので、こ

    ブラウザのキャッシュ - Carpe Diem
  • B TreeとB+ Treeの違い - Carpe Diem

    概要 インデックスに対してMongoDBはB Treeを採用し、MySQLのInnoDBはB+ Treeを採用しています。 どうして採用しているアルゴリズムが違うのだろう?と思って調べてみました。 主な違い B+ TreeはほとんどB Treeと同じですが、以下の点が異なります。 リーフノードとリーフノードを結ぶポインタがある データはリーフノードのみに保持する 具体例 言葉だけだと分かりにくいので、Visualizeするツールを使って具体例を表示します。 [1, 2, 3, 4, 5, 6, 8, 10, 15, 18]という数列に対し、Order: 3で作ってみます。 Orderは1ノードから出る枝の数のことです。 B Tree B-Tree Visualization B+ Tree B+ Tree Visualization 先程のB Treeと違って、データはリーフノードに持つの

    B TreeとB+ Treeの違い - Carpe Diem
  • Docker Data Volume を理解する - Carpe Diem

    概要 Dockerのデータをホスト側に保持する方法をまとめます。 Dockerはコンテナの破棄・再作成が簡単にできる一方、そのままだとデータも消えてしまいます。 今回のDate Volumeはデータの永続性を保つべきシーンで必要となる知識です。 環境 OSX 10.11.4 docker 1.11.0 docker-machine 0.7.0 4つのパターン docker runするときに以下のオプションをつけると使えます。 -v <container_path> -v <host_path>:<container_path> -v <data_volume>:<container_path> --volumes-from <container_name> これらを順に説明していきます。 通常のDocker run 今回はubuntuのimageを使います。 $ docker run -i

    Docker Data Volume を理解する - Carpe Diem
  • JWTを認証用トークンに使う時に調べたこと - Carpe Diem

    概要 JWTを認証用トークンに使う時に調べたことをまとめます。 JWTとは JWTはJWSやJWEの構造の中にエンコードして埋め込まれるJSON形式のclaimのセットです。 一般的にはJWS形式のJWTが使われるのでそれを前提に進めます。 JWS形式のJWTは以下のフォーマットです。 {base64エンコードしたheader}.{base64エンコードしたclaims}.{署名} 以下の特徴があります。 発行者が鍵を使ってJSONを署名(or HMAC)し、トークンとして扱う。 暗号化ではないので、JSON の中身は誰でも見られる。 発行者は鍵を使ってメッセージの検証ができるので、改竄を検知できる。 以上の点からトークンとして向いているため、認証トークンとして用いられるようになってきました。 Cookieとの認証フロー比較 ref: Cookies vs Tokens. Getting

    JWTを認証用トークンに使う時に調べたこと - Carpe Diem
    delegate
    delegate 2016/07/01
  • 1