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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
94k
新卒1年目QAが リリース基準の"なぜ"をたどってみた
cybozuinsideout
PRO
1
950
kintone リサーチ副部/UXリサーチャー 業務紹介
cybozuinsideout
PRO
0
200
私たちが『JaSST協賛』から『外部コネクト』チームになった理由
cybozuinsideout
PRO
0
620
LLMでもいつものテスト技術〜意外と半分はこれまでのテストでした〜
cybozuinsideout
PRO
1
1.2k
kintone開発のプラットフォームエンジニアの紹介
cybozuinsideout
PRO
1
1.8k
LLMアプリの品質保証
cybozuinsideout
PRO
1
900
技術広報チームに丸投げしない!「一緒につくる」スポンサー活動
cybozuinsideout
PRO
0
320
テクニカルライター (グループウェア) について
cybozuinsideout
PRO
0
320
Other Decks in Technology
See All in Technology
国際カードブランドルール変更に伴うクレジットカード決済取引仕様変更について
k1style
0
130
[EMNLP26] RIGEL: Self-Distilled Score Adaptation for Image and Video Captioning Evaluation
keio_smilab
PRO
0
110
CSS2026:OWS研究会・招待講演「世界観を、実装する」
atsush1_sada
2
110
Tofu-Controller lightning talk @ Containerday 2026
gionn
0
160
データエンジニアの次の戦場は "プロセスエンジニアリング"
sansantech
PRO
1
150
Local CI × GitHub Actions
gogutan
3
260
DevelopersIO 2026 Tokyo 現時点の衛星通信サービスの現状を整理してみる
maroon1st
0
110
sue445's proposals 2026
sue445
0
120
Active Record Connection Adaptersにおける長年の課題に再び取り組む
yahonda
0
400
生成AI時代、PMは事業責任者に進化するともっと面白い〜PMだからこそ事業構造を動かせる時代に〜
kakehashi
PRO
0
180
初海外で注意すべきこと12選!!!安全快適なre:invent生活にするために
yuuuuuuu168
1
190
React改造してみた
tsukina_7mochi
0
150
Featured
See All Featured
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
640
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
46k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
560
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
530
Automating Front-end Workflow
addyosmani
1369
210k
Balancing Empowerment & Direction
lara
6
1.3k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Navigating Weather and Climate Data
rabernat
0
560
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
59k
Exploring anti-patterns in Rails
aemeredith
4
540
Un-Boring Meetings
codingconduct
0
460
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