Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Webアプリケーション概要 2021 / Web Application Overview 2021
Search
Cybozu
PRO
April 26, 2021
Technology
140k
32
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Webアプリケーション概要 2021 / Web Application Overview 2021
Cybozu
PRO
April 26, 2021
More Decks by Cybozu
See All by Cybozu
サイボウズ 開発本部採用ピッチ / Cybozu Engineer Recruit
cybozuinsideout
PRO
12
91k
新卒1年目QAが リリース基準の"なぜ"をたどってみた
cybozuinsideout
PRO
1
880
kintone リサーチ副部/UXリサーチャー 業務紹介
cybozuinsideout
PRO
0
190
私たちが『JaSST協賛』から『外部コネクト』チームになった理由
cybozuinsideout
PRO
0
590
LLMでもいつものテスト技術〜意外と半分はこれまでのテストでした〜
cybozuinsideout
PRO
1
1.1k
kintone開発のプラットフォームエンジニアの紹介
cybozuinsideout
PRO
1
1.7k
LLMアプリの品質保証
cybozuinsideout
PRO
1
840
技術広報チームに丸投げしない!「一緒につくる」スポンサー活動
cybozuinsideout
PRO
0
310
テクニカルライター (グループウェア) について
cybozuinsideout
PRO
0
300
Other Decks in Technology
See All in Technology
AI 時代の Azure エンジニアリング ~ 私たちは何を磨き、何を任せるのか ~
chack411
1
250
10年欲しかった音楽管理アプリを、AIと一緒に作りはじめた
judau
1
200
2026-10-01_MagicPod_QAハーネスエンジニアリングとQA組織の未来像
ynisqa1988
0
120
Swap and Memory Reclaim - Squeezing Out More RAM
ennael
PRO
1
1.5k
Lambda MicroVMsが分からなすぎたので使い所を1から考えてみた
tsukuboshi
2
280
Amazon Bedrock Agents ClassicからAmazon Bedrock AgentCoreへ移行した際、ガードレール設定が2箇所に割れた話
matsunobu
0
160
【Findyテック文化祭ワークショップ】新卒エンジニア&採用担当と作る、 なりたい姿と今やるべき一歩
dip_tech
PRO
0
150
HacobuにおけるFDEとは/登壇資料(戸井田 裕貴)
hacobu
PRO
1
670
AWS FinOps Agent 結局何が得意なの?
siromi
0
230
Snowflake Horizon Catalog と Apache Iceberg で作る オープンなデータ基盤
kitagawaz
0
370
DORA_Metrics.pdf
wagnerfusca
1
140
猫でもわかるKiro Web
kentapapa
1
160
Featured
See All Featured
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.1k
Accessibility Awareness
sabderemane
1
230
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
20k
Producing Creativity
orderedlist
PRO
348
41k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
2k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.7k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
600
How to make the Groovebox
asonas
2
2.5k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6.3k
AI: The stuff that nobody shows you
jnunemaker
PRO
10
1.1k
エンジニアに許された特別な時間の終わり
watany
109
250k
Transcript
Webアプリケーション概要 2021 Yakumoチーム, Slash/CyDE-Cチーム ⾚井駿平
Introduction ▌Webアプリを作るのに必要な基礎知識を話します l 割りと雑多な知識 l 必要になった時にキーワードを思い出して⾃分で調べられ るように
whoami ▌⾚井 駿平 l 2013年⼊社 l Yakumoチーム, Slash/CyDE-Cチーム 所属 lAWSやミドルウェアからwebフロントエンドまで⾊々担当
Webアプリケーションとはなんぞや ▌Webブラウザをインターフェースとして⼊出⼒するアプリ ケーション l 通信はHTTP、表⽰はHTML, CSS ▌実際のアプリはサーバーにある ▌≠ネイティブアプリ、デスクトップアプリ l 内部的にはWebアプリが提供するAPIを叩いている場合も
▌サイボウズが作っている製品はほとんどがWebアプリ
Webサーバーは何をする?
Webサーバー ▌HTTPを処理するサーバー l クライアントからリクエ ストを受け付けて l 所望の結果を返す ▌Apache, IIS, nginx...
request: index.htmlください response: index.html どうぞ!
Webサーバーがやること ▌リクエストを受け付ける ▌結果を(読み込む|計算する) ▌結果を送り返す ▌通信と計算のセット l ⼊⼒+計算+出⼒ = プログラムの本質 l
通信をプログラムでどう⾏うか → Socket
Socket ▌サーバーとクライアントで通信するためのAPI l 主にTCP, UDP を使う l 同じマシン同⼠で通信しても、別のマシンと通信してもよ い
Socket: クライアント側 ▌やること l 初期化 socket() l サーバーと接続 connect() l
送信 write() / 受信 read() l 終了 close() int sock = socket(AF_INET, SOCK_STREAM, 0); connect(sock, アドレス, len); write(sock, buf, buflen); read(sock, buf, buflen); close(sock);
Socket: サーバー側 ▌やること l socket() l アドレスを設定 bind() l リクエスト受付
listen() l リクエストを確⽴ accept() l read()/write() l close() int sock = socket(AF_INET, SOCK_STREAM, 0); bind(sock, アドレス, len); listen(sock, 128); while(1) { int fd = accept(sock, NULL, NULL); write(fd, buf, buflen); read(fd, buf, buflen); close(fd); } close(sock);
複数のリクエストが来たら ▌サーバーが1つのリクエストを処理している時に別のリクエス トが来る l 前のページのコードだとどうなる?
同時に複数のリクエストを捌く ▌リクエストの待受とリクエストの処理を同時に⾏えると良い l acceptが返ったら処理を開始 l 処理の結果を待たずに、すぐにacceptに戻る ▌プロセスやスレッドを使う while(1) { int
fd = accept(sock, NULL, NULL); 処理開始(fd); //すぐに返ってくる }
プロセス ▌プログラムの実⾏の単位 l コマンドやアプリを起動するとプロセスが⽴ち上がる l 別のプロセスのメモリにはアクセスできない l 異なるプロセスは並列に動くことができる ▌Webサーバーでは l
リクエストを受付 l 処理プロセスを起動してソケットを引き継ぐ
スレッド ▌1つのプロセスの中の処理の単位 l プロセスより軽い l 並列に実⾏可能 l 同じプロセスの別のスレッドのメモリにアクセスできる ▌Webサーバーでは l
リクエストを受付 l 処理スレッドを起動して処理をする
▌Socketとプロセス/スレッドを使えば、webサーバーのような ものを作れる l 接続数が⾮常に多くなると? (C10K問題) → ⾮同期I/Oなど を調べてみよう
Webアプリケーション
動的なWebページ ▌Webは静的なページを返すだけじゃない l Input-Process-Output (= プログラム) l“Process” で任意のプログラムを実⾏して結果を返す l サイボウズOfficeもGaroonもkintoneもメールワイズもこの
タイプ ▌処理の仕⽅はいろいろある
CGI: Common Gateway Interface ▌Webサーバーとプログラムがやりとりするためのインターフェース l リクエストが来るたびにアプリのプロセスを起動する l リクエストの内容は、環境変数や標準⼊⼒で渡される l
結果は標準出⼒で返す ▌昔はこのやり⽅が主流 l Perlの時代 l 毎回プロセスを起動するので遅い l サイボウズ Office / メールワイズは今でもこれ request response program stdin/env stdout
Webアプリケーションサーバー ▌Webアプリケーションを実⾏するサーバー l CGIと異なり、通常起動しっぱなし l Webサーバーがアプリケーションサーバーにリクエストを 中継する l主にHTTPでやりとり l アプリケーションサーバーとアプリの間
l特定のメソッドを呼んだりしてやりとり request response App server request response App
永続化/データベース ▌Webアプリを作るとデータを保存したくなる l プログラムやマシンが終了してもデータが残る l cf. memcached ▌⾊々なやり⽅ l 素朴にファイルに保存
l ⾃分で競合、不整合などを回避するのは⼤変 l ⼤規模だと⼤変になる l サイボウズOffice… l データベース管理システム(DBMS) l 難しいことの⾯倒を⾒てくれる
データベース管理システム(DBMS) ▌RDBMS / SQL l 「関係モデル」というものを扱うデータベース l SQLという⾔語で操作する l 後⽇詳しくやります
▌NoSQL l SQLへ対抗して出てきたデータベース(⼤抵速いがトレードオフ有り) l キーバリューストア(KVS) l キーとバリューのペアの形式だけ保存 l ドキュメント指向データベース l 柔軟な構造のデータを保存
ログイン ▌Webアプリにはほぼ必須な機能 l ユーザー毎にデータを保存/ユーザーを特定 l ログインした後、別のページから戻ってきてもログインさ れたまま l どう実現する?
Cookie (RFC 6265) ▌サーバー側からクライアントにデータを保存される仕組み l サーバー:「Set-Cookie: <キー>=<値> 」というヘッダー を載せてレスポンスを返す lクライアントはそのペアを保存する
l クライアントはリクエストに「Cookie: <キー>=<値>」 を載せる lSet-Cookieを返してきたドメインにだけ送る ▌HTTPが状態を持つことができる Set-Cookie: login=true Cookie: login=true
セッション ▌⼀連のアクセスでデータを保持する仕組み l Cookieじゃセキュリティ的に… l パスワードを毎回送る? 勝⼿に書き換えられたら? l データ量に限界 ▌セッション開始時(ログイン時に)ランダムな
IDを発⾏ l それをCookieに保持する l データはIDをキーにサーバー側に保存する Set-Cookie: lD=42 Cookie: ID=42 42, user = aono 42, loginTime= 10:12 104, user=akai …
パスワードの保存 ▌ログインできるWebアプリを作る場合ユーザー登録が必要 l 多くの場合、ユーザー名とパスワードを登録させる l パスワードをデータベースに保存していい? l 情報流出したら?
パスワードのハッシュ化 ▌パスワードはハッシュ関数を通したハッシュ値を保存する l ログイン時は⼊⼒されたパスワードのハッシュ値を取り、保存 されているハッシュ値と⽐較 l ⼀致すればOK ▌ハッシュ関数 l 任意の⻑さのバイト列から固定⻑のバイト列を出⼒
l 出⼒から⼊⼒の値の推測が難しい l SHA-2, SHA-1, MD5 など l より安全に: salt, HMAC... SHA-1の例 'password' → 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8 '123456' → 7c4a8d09ca3762af61e59520943dc26494f8941b
HTTPS ▌HTTPは通信内容が丸⾒え l パスワードを送ったら?セッションID⾒られたら? ▌HTTPをTLSで暗号化して通信する→HTTPS l 内容を⾒られない。改ざんされない。なりすまされない。 l cybozu.comは必ずHTTPSを使う l
現代では必須 (商⽤なら)
HTTPSは事実上必須 ▌公的/商業的なサイトで新しく作るならhttpのみはあり得ない l ブラウザに怒られる l 古いサイトではhttpがまだまだ残っている http://abehiroshi.la.coocan.jp
QUALYS SSL LABS cybozu.comはA+評価
Webアプリケーションフレームワーク ▌Webアプリを作るのに便利な機能が詰まったライブラリ l HTTPの処理、Cookie、データベースへのアクセス、テンプ レートエンジン などなど l 現代でWebアプリを新たに作るなら、何らかのフレーム ワークを使うことになる ▌Ruby
on Rails, Spring Framework, Django などが有名所 l 死んでいったフレームワーク達も数知れず l 独⾃のフレームワークが⽣み出されることも…
フロントエンド
HTML ▌⽂書に構造や意味を与えるための⾔語 l ⾒出し、段落、他の⽂書へのリンク、… l <h1></h1>, <p></p>, <a href=”https://〜”></a>, …
▌それぞれのタグがどういう意味を持つからルールで決まっている l https://www.w3.org/TR/html5/ l 正しい使い⽅をする→機械が読める→スクリーンリーダが読め る→アクセシブル ▌講義では詳しくはやらないので、⾃分で調べてね
テンプレートエンジン ▌HTMLの中にデータを埋めたり、プログラム的に表⽰を変える 仕組み l JSP, Freemarker, PHP, Smarty, eRuby, …
▌動的にHTMLを組み⽴てるためのツール <div> こんにちは! ${user.name}さん。 <#if user.isAdmin > あなたは管理者です。 </#if> </div> + user.name = “⾚井” user.isAdmin = false <div> こんにちは! ⾚井さん。 </div>
CSS ▌HTMLの⽂書の⾒た⽬を決めるための仕組み l ⽂字の⼤きさ、⾊、背景、…。 ▌意味と⾒た⽬を分離する l HTMLには⾒た⽬を書かない ▌地道に調整しないといけないので、⼤変な世界…
JavaScript ▌現代のWebアプリはサーバー側だけでは完結しない l JavaScriptをブラウザで動かしてダイナミックな動作をする l DOM操作 lJavaScriptを使って、画⾯を書き換える。 l Ajax/XHR lJavaScriptからHTTP通信を⾏う。画⾯遷移せずに⾊々なアクションを⾏える。
l フレームワーク: lJavaScriptにもフレームワークがたくさん lReact, Vue, Closure Libarary, etc.
Web API ▌Webアプリケーションの処理をネットワーク越しに呼び出す l HTMLではなくデータ(JSON, XML等)を返す l サーバー内のデータを更新する l JavaScriptから呼ぶ
▌例えば、kintoneはHTMLの⽣成は最低限 l ほとんどAPIを呼び出している ▌サーバーとクライアントの分離が出来てシンプルになる傾向
▌Webアプリケーションはここで説明しなかったものも含め、 たくさんの要素が組み合わさって出来ている l この講義は取っ掛かり。 l 随時知っていきましょう
使⽤した画像のライセンス
By RRZEicons [CC BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0)], via Wikimedia Commons https://commons.wikimedia.org/wiki/File%3AServer-multiple.svg
By Sir Stig (Own work (Transfered by Mono)) [CC BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0) or GFDL (http://www.gnu.org/copyleft/fdl.html)], via Wikimedia Commons https://commons.wikimedia.org/wiki/File%3AAluminium_MacBook.png