1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[nginx] Cookie でアクセスを制限する

Last updated at Posted at 2022-05-03

nginx で、訪問者に Cookie を食わせ識別子にして、アクセス制限を行う。IP 制限だけでは難しく、特定のユーザをダイレクトに弾きたい場合などに。

ngx_http_userid_module モジュールを使う

基本設定

トラッキングの設定

server {
	userid          on;
	userid_name     uid;
	userid_domain   yourdomain.com;
	userid_path     /;
	userid_expires  30d;
}

uid や expires はお好みで。

アクセスログの設定

適当な箇所に $uid_set $uid_got を挿入する。この記述だけで、発行された識別子がアクセスログに記録されていく。どちらにも同じ書式の値が入るが、初回のアクセスには uid_set に、以降は uid_got に値が入る。

http {
	log_format deflate '$remote_addr - $remote_user [$time_local] "$request" '
                       '$status $body_bytes_sent "$http_referer" "$http_user_agent" '
                       '"$uid_set" "$uid_got"';
}

$uid_set
クッキー名と送信したクライアントの識別子

$uid_got
クッキー名と受け取ったクライアントの識別子

ドキュメントによると、初回に発行した識別子を送信し (uid_setに投入) Cookie にセット、以降は Cookie から識別子を受信する (uid_gotに投入) 。

アクセスログの例

0.0.0.0 - - [00/Jan/0000:00:00:00 +0000] "GET /index.html HTTP/1.1" 200 100 "" "Mozilla/5.0" "-" "uid=XXXXXXXXXXXXXXXXXXXXXX"

"uid=XXXXXXXXXXXXXXXXXXXXXX" が識別子である。なお、ブラウザのデベロッパーツールなどで付与されている Cookie を見ると、これとは異なる文字列が記述されている。

特定のキーを持っているユーザをdenyする

アクセスログなどからユーザの識別子が判明したら、後はそれを if や map などを用いて料理する。

server {
	if ($uid_got = "uid=XXXXXXXXXX") {
         return 403;
    }
}

補足

同じブラウザを使っていれば(同じ Cookie を持っていれば) IP アドレスが変化しても追うことができる。 Cookie なのでブラウザを切り替えたり Cookie を削除されると ID は変わってしまうが、ユーザの行動次第で追跡もしやすくなる。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?