質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

3回答

4693閲覧

Node+express ブラウザ側のIPを取得したい

uroncha

総合スコア54

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

0クリップ

投稿2021/11/16 02:13

node.js + express でWEBサービスを構築しようとしています。

ブラウザ側のIPアドレス、ブラウザの種類、OS情報などを、
サーバーにログとして残したいと思っています。

Requestオブジェクトの中の値から取れそうな気がして探しているのですが
どの値が適切か分かりません。

ご教授お願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/11/16 02:15

Google Analyticsなど、何かしらの外部サービスを活用する、というのも1つの方法として考えられますが、自力でやらないといけない事情がある感じでしょうか?
uroncha

2021/11/16 02:52

ご質問ありがとうございます。 具体的にはWebサイトへログインした端末情報を取得したいと考えています。 ログに取りたいと質問に書きましたが、実際はDBに保存してシステム側で活用したいです。 例えば不正アクセスと考えられる端末を強制ログオフなどさせたいです。 よろしくお願い致します。
guest

回答3

0

request-ipなどを使いましょう

js

1const { getClientIp, mw } = require("request-ip"); 2app.use(mw()); 3 4app.use((req, res, next) => { 5 console.log(getClientIp(req)); 6 next() 7}); 8

これでIPがコンソールに出ます

投稿2021/11/16 05:22

Waki285

総合スコア2014

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

HTTPリクエストに関して勉強しましょう。
それを踏まえて利用しているWebフレームワークでのお作法を調査するという流れになります。

参考記事

ざっくり言うと、普段我々がブラウザを使ってWebサーバに通信する時、
各自が適当な文字列を送受信しあっていたら適切な情報の授受なんて出来ません。
何かしらの統一のルールが必要です。

なのでインターネットを作った人がRFCというインターネットの仕様書を作りました。
そこに「HTTP」という通信規約(プロトコル)を用意しています。
Webサーバとクライアントは「HTTP」のルールに従って情報の授受をしています。


ブラウザ側のIPアドレス、ブラウザの種類、OS情報などを、

サーバーにログとして残したいと思っています。

まず「IPアドレス」に関して解説します。
HTTPの基礎の部分になっているTCP通信に使われているので別ルートからの取得になります。

TCP通信では通信を受け取る際、送り主の情報がヘッダーに引っ付いています。
なのでそのヘッダー部分を閲覧することでどのIPアドレスかが分かるようになっています。

具体的にはフレームワーク毎にドキュメントを調べる必要があります。
Express.jsの場合は
app.get(url, (req, res) => {})のreqはRequestのインスタンスであり、
req.ipのプロパティを閲覧すればIPアドレスが取得出来るようになっています。

IPアドレスが127.0.0.1になってしまう場合、
NginX等のリバースプロキシを噛ませてある可能性が高いので
Expressをtrust proxyモードで実行しましょう。


「ブラウザの種類」、「OS情報」はHTTPリクエストヘッダーのUser-Agentの値を利用します。

Express.jsに於いてはreq.get("User-Agent")もしくはreq.header("User-Agent")で取得出来るでしょう。

req.getのAliasとしてreq.headerが定義されている事が確認できる

探すとexpress-useragentという質問に於けるこれこれ!みたいなライブラリ見つけました。

js

1const useragent = require('express-useragent'); 2 3app.use(useragent.express()); 4 5app.get('/', (req, res) => { 6 res.send(req.useragent); 7});

js

1{ 2 "isMobile":false, 3 "isDesktop":true, 4 "isBot":false, 5 ..... 6 "browser":"Chrome", 7 "version":"17.0.963.79", 8 "os":"Windows 7", 9 "platform":"Microsoft Windows", 10 "source":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.79..." 11}

うーん、これは楽。

しかし、User-Agentの仕様を見ればわかりますが、
別に書式が統一されているわけではなく、
ブラウザ達が辛うじて空気読んで横並びの文字列を設定しているに過ぎません。

最初のMozilla/5.0とか意味不明
経緯を調べると1990年代にネットスケープというブラウザがシェアを取っていたが、User-Agentを判別してそれでしか動作しないWebサーバがあり
他のブラウザまでもが詐称の為にUser-AgentにMozilla/番号の記載し始めたのが起原だとか……
大昔の慣習の名残かよ

参考記事: UserAgentからOS/ブラウザなどの調べかたのまとめ - Qiita

という風に、世間一般で流通しているブラウザは大体が慣習に従って命名していますが、そもそも自己申告です。
例えばコマンドラインからHTTPリクエストを発射出来るcurlというプログラムがありますが、
curl -H "User-Agent: hoge" https://example.com/という風に好き勝手なUser-Agentを指定してHTTPリクエストを飛ばせます。

私が仮にXSSからのセッションハイジャックを使って悪さをしていたとして、
XSSでセッション情報を抜き取る時にUser-Agentもコピーしてヘッダーにつけて不正アクセスするわなって感じです。
厳密な一個人を特定するとか、不正ログイン検知の用途に使うのは中々難しいのが現状です。

AppleやGoogle、Amazonなんかは初めての端末でログインすると、
「これ本物か?」と他の端末に対して聞いてくるような仕組みが備わっています。
何の技術使ってるんでしょうね?フィンガープリントとか?秘匿情報だから分からん……

なので自分のWebサービスにGoogle等のログインシステムを移植するOAuthを使ってタダ乗りさせて貰うのが楽で良いと思います。
企業でやってて個人情報を抜く必要があるとかなら頑張ってください。

投稿2021/11/16 05:15

miyabi-sun

総合スコア21203

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uroncha

2021/11/16 05:27

200%以上の完璧な回答を頂きました。 ありがとうございました。
guest

0

ブラウザの開発ツールで、リクエストヘッダやレスポンスヘッダが確認できますので、
必要な値を見つけてください。
イメージ説明

また、サーバー側でログを残すには、node.jsのパッケージ、log4jsなどが有名です。

投稿2021/11/16 02:55

technocore

総合スコア7337

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uroncha

2021/11/16 03:13

ご回答ありがとうございます。 開発者ツールの件ありがとうございました。 しかし確認しましたがブラウザ側のIPアドレスは確認できませんでした。 サーバー側でブラウザ側のIPアドレスを収集するのは 一般的な処理ではないのでしょうか?(無知ですみません)
technocore

2021/11/16 03:54

response.headerやrequest.headerからも必要な値が取り出せます。 express側でconsole.logなどに出力してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問