読者です 読者をやめる 読者になる 読者になる

membaseは真剣に使わない方がいいと思う

membase Erlang

membaseはなかなか面白いプロジェクト、そう思っていた時期が俺にもありました。(AA略

membaseのWebコンソールは本当にリッチなので、Erlangでどういう風に書いているのかなぁと思って研究していた次第。とりあえず、管理ユーザーのログイン状態の保持、所謂セッション処理はどうやっているんだろうと思ってコードの該当箇所を探していた。たぶん、これ。

コードのキモの部分は以下のようになっている。Erlangが全く分からない方にもこの面白さを感じていただきたいので、僕がコメントをつけた。

apply_auth_cookie(Req, F, Args) ->
    UserPassword = case extract_auth(Req) of
                       %% extract_authでパスワードが取得できなかった場合
                       undefined ->
                           %% Cookieから認証情報を取得
                           case Req:get_header_value("Cookie") of
                               %% Cookieが未設定の場合は認証されていない
                               undefined -> undefined;
                               RawCookies ->
                                   %% Cookieをパースしてauthという値を探す
                                   ParsedCookies = mochiweb_cookies:parse_cookie(RawCookies),
                                   case proplists:get_value("auth", ParsedCookies) of
                                       undefined -> undefined;
                                       %% authという値があれば、それをurlデコードしてbase64デコードしたものが、
                                       %% user:passwordの値・・・だと!?
				       %% (つまりBasic認証と同じ)
                                       V -> parse_user_password(base64:decode_to_string(mochiweb_util:unquote(V)))
                                   end
                           end;
                       %% extract_authでパスワードが取得できた場合は
		       %% その値をそのまま使う
                       X -> X
                   end,
    apply_auth_with_auth_data(Req, F, Args, UserPassword).

何か雲行きが怪しい・・・。extract_authの中身はどうなっているかというと、

%% どうみてもBasic認証です。本当にありがとうございました
extract_auth(username, Req) ->
    case Req:get_header_value("authorization") of
        "Basic " ++ Value ->
            parse_user(base64:decode_to_string(Value));
        _ -> undefined
    end.

といわけで、"user:password"をbase64エンコードしたものをHTTPヘッダーかCookieに乗せているだけという診断に達した。ほとんどBasic認証と同じ水準のセキュリティレベル。

REST APIの使いやすさを考えBasic認証でもよい、あるいは内部ネットワークからのアクセスに縛ればよいと考えて、あえてこういう実装にしているのかもしれないけど、Webコンソールまでこういった実装にする必要はないんじゃないかなぁ。Webコンソールのリッチさに騙されて、痛い目にあう人が出てきそうだ。

membase(ns_server)のコードは結構きれいに書かれているように見え、Erlangの勉強にはいいが、それ以上のメリットを全く感じない。これ本当にプロダクション環境で使っている人いるの?