å ç¢ãªããã³ããšã³ãè³æ Œæ å ±ç®¡çãšã³ãžã³ã§ãŠã§ãã¢ããªã±ãŒã·ã§ã³ãä¿è·ããŸããèªèšŒã®ãã¹ããã©ã¯ãã£ã¹ãå®å šãªã¹ãã¬ãŒãžãäžè¬çãªããã³ããšã³ãæ»æã«å¯Ÿããç·©åæŠç¥ã«ã€ããŠåŠã³ãŸãããã
ããã³ããšã³ãè³æ Œæ å ±ç®¡çã»ãã¥ãªãã£ãšã³ãžã³ïŒèªèšŒä¿è·
仿¥ã®ããžã¿ã«ç°å¢ã«ãããŠããŠã§ãã¢ããªã±ãŒã·ã§ã³ãæ©å¯æ§ã®é«ããŠãŒã¶ãŒããŒã¿ãæ±ãäžã§ãå ç¢ãªããã³ããšã³ãã»ãã¥ãªãã£ã¯æéèŠã§ãããã®ã»ãã¥ãªãã£ã®éèŠãªèŠçŽ ã¯å¹æçãªè³æ Œæ å ±ç®¡çã§ãããããã«ã¯ãŠãŒã¶ãŒèªèšŒãšèªå¯ã®å®å šãªåãæ±ããå«ãŸããŸããé©åã«èšèšãããããã³ããšã³ãè³æ Œæ å ±ç®¡çã»ãã¥ãªãã£ãšã³ãžã³ã¯ãããŸããŸãªæ»æã«å¯Ÿãã第äžã®é²åŸ¡ç·ãšããŠæ©èœãããŠãŒã¶ãŒã®è³æ Œæ å ±ãä¿è·ããããŒã¿ã®å®å šæ§ãä¿èšŒããŸãã
è åšã®ç¶æ³ãçè§£ãã
ã»ãã¥ãªãã£ãšã³ãžã³ã®æè¡çåŽé¢ã«é£ã³èŸŒãåã«ãããã³ããšã³ãã¢ããªã±ãŒã·ã§ã³ãæšçãšããäžè¬çãªè åšãçè§£ããããšãéèŠã§ãããããã«ã¯ä»¥äžãå«ãŸããŸãïŒ
- ã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã° (XSS): æ»æè ãä»ã®ãŠãŒã¶ãŒãé²èЧãããŠã§ããµã€ãã«æªæã®ããã¹ã¯ãªãããæ³šå ¥ããŸãããããã®ã¹ã¯ãªããã¯ãã¯ãããŒãçãã ãããŠãŒã¶ãŒããã£ãã·ã³ã°ãµã€ãã«ãªãã€ã¬ã¯ããããããŠã§ããµã€ãã®ã³ã³ãã³ãã倿Žãããããå¯èœæ§ããããŸãã
- ã¯ãã¹ãµã€ããªã¯ãšã¹ããã©ãŒãžã§ãª (CSRF): æ»æè ããŠãŒã¶ãŒãéšããŠããã¹ã¯ãŒãã®å€æŽãè³Œå ¥ãªã©ãæå³ããªãã¢ã¯ã·ã§ã³ãå®è¡ãããŸãã
- äžéè (MitM) æ»æ: æ»æè ããŠãŒã¶ãŒã®ãã©ãŠã¶ãšãµãŒããŒéã®éä¿¡ãååããè³æ Œæ å ±ãçãã ããããŒã¿ãæ¹ãããããããå¯èœæ§ããããŸãã
- ã¯ã¬ãã³ã·ã£ã«ã¹ã¿ããã£ã³ã°: æ»æè ãä»ã®äŸµå®³ããåŸãæŒæŽ©ãããŠãŒã¶ãŒåãšãã¹ã¯ãŒãã®ãªã¹ãã䜿çšããŠãããªãã®ã¢ããªã±ãŒã·ã§ã³ã®ã¢ã«ãŠã³ããžã®ã¢ã¯ã»ã¹ã詊ã¿ãŸãã
- ãã«ãŒããã©ãŒã¹æ»æ: æ»æè ã倿°ã®å¯èœãªçµã¿åããã詊ãããšã«ãã£ãŠããŠãŒã¶ãŒã®è³æ Œæ å ±ãæšæž¬ããããšããŸãã
- ã»ãã·ã§ã³ãã€ãžã£ãã¯: æ»æè ããŠãŒã¶ãŒã®ã»ãã·ã§ã³IDãçãã ãæšæž¬ãããããŠããŠãŒã¶ãŒã«ãªãããŸããäžæ£ãªã¢ã¯ã»ã¹ãåŸãŸãã
- ã¯ãªãã¯ãžã£ããã³ã°: æ»æè ããŠãŒã¶ãŒãéšããŠãèªèããŠãããã®ãšã¯ç°ãªããã®ãã¯ãªãã¯ãããæå³ããªãã¢ã¯ã·ã§ã³ãåŒãèµ·ãããããæ©å¯æ å ±ãæŒæŽ©ããããããŸãã
ãããã®è åšã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®ã¬ãã«ã§è匱æ§ã«å¯ŸåŠããå æ¬çãªã»ãã¥ãªãã£ã¢ãããŒãã®å¿ èŠæ§ãæµ®ã圫ãã«ããç¹ã«ãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ãçºçããããã³ããšã³ãã«çŠç¹ãåœãŠãããšã®éèŠæ§ã瀺ããŠããŸãã
ããã³ããšã³ãè³æ Œæ å ±ç®¡çã»ãã¥ãªãã£ãšã³ãžã³ã®äž»èŠã³ã³ããŒãã³ã
å ç¢ãªããã³ããšã³ãè³æ Œæ å ±ç®¡çã»ãã¥ãªãã£ãšã³ãžã³ã¯éåžžããŠãŒã¶ãŒã®è³æ Œæ å ±ãä¿è·ããèªèšŒããã»ã¹ãå®å šã«ããããã«é£æºããŠæ©èœããããã€ãã®äž»èŠã³ã³ããŒãã³ãã§æ§æãããŠããŸãããããã®ã³ã³ããŒãã³ãã«ã¯ä»¥äžãå«ãŸããŸãïŒ
1. å®å šãªè³æ Œæ å ±ã¹ãã¬ãŒãž
ã¯ã©ã€ã¢ã³ãåŽã§ãŠãŒã¶ãŒã®è³æ Œæ å ±ãã©ã®ããã«ä¿åããããã¯éåžžã«éèŠã§ãããã¹ã¯ãŒããå¹³æã§ä¿åããããšã¯ãé倧ãªã»ãã¥ãªãã£ãªã¹ã¯ã§ããå®å šãªã¹ãã¬ãŒãžã®ããã®ãã¹ããã©ã¯ãã£ã¹ã¯ä»¥äžã®éãã§ãïŒ
- ãã¹ã¯ãŒããããŒã«ã«ã«ä¿åããªã: ããŒã«ã«ã¹ãã¬ãŒãžãã»ãã·ã§ã³ã¹ãã¬ãŒãžããŸãã¯ã¯ãããŒã«çŽæ¥ãã¹ã¯ãŒããä¿åããªãã§ãã ããããããã®ã¹ãã¬ãŒãžã¡ã«ããºã ã¯XSSæ»æã«å¯ŸããŠè匱ã§ãã
- ããŒã¯ã³ããŒã¹èªèšŒã䜿çšãã: ããŒã¯ã³ããŒã¹èªèšŒïŒäŸïŒJWT - JSON Web TokensïŒãå®è£ ããŠãæ©å¯æ å ±ããã©ãŠã¶ã«çŽæ¥ä¿åããã®ãé¿ããŸããããŒã¯ã³ã¯ãXSSããã³MitMæ»æãç·©åããããã« `HttpOnly` ããã³ `Secure` 屿§ã§ããŒã¯ãããã¯ãããŒã«å®å šã«ä¿åããŸãã
- å®å šãªã¹ãã¬ãŒãžã®ããã«ãã©ãŠã¶APIãæŽ»çšãã: èªèšŒããŒã¯ã³ä»¥å€ã®æ©å¯ããŒã¿ïŒAPIããŒãªã©ïŒã«ã€ããŠã¯ããã©ãŠã¶ã®çµã¿èŸŒã¿æå·åAPIïŒWeb Crypto APIïŒã䜿çšããŠããŒã¿ãæå·åããŠããããŒã«ã«ã¹ãã¬ãŒãžã«ä¿åããããšãæ€èšããŠãã ãããããã«ããä¿è·å±€ã远å ãããŸãããæ éãªå®è£ ãå¿ èŠã§ãã
äŸïŒJWTããŒã¯ã³ã¹ãã¬ãŒãž
JWTã䜿çšããå ŽåãããŒã¯ã³ã `HttpOnly` ã¯ãããŒã«ä¿åããŠãJavaScriptãçŽæ¥ã¢ã¯ã»ã¹ã§ããªãããã«ããXSSæ»æãç·©åããŸãã`Secure` 屿§ã¯ãã¯ãããŒãHTTPSçµç±ã§ã®ã¿éä¿¡ãããããšãä¿èšŒããŸãã
// JWTããŒã¯ã³ãã¯ãããŒã«èšå®
document.cookie = "authToken=YOUR_JWT_TOKEN; HttpOnly; Secure; Path=/";
2. å ¥åå€ã®æ€èšŒãšãµãã¿ã€ãº
æªæã®ããå ¥åãããã¯ãšã³ãã·ã¹ãã ã«å°éããã®ãé²ãããšã¯äžå¯æ¬ ã§ããããã³ããšã³ãã§å ç¢ãªå ¥åå€ã®æ€èšŒãšãµãã¿ã€ãºãå®è£ ããæœåšçã«æå®³ãªããŒã¿ããã£ã«ã¿ãªã³ã°ããŸãã
- ãã¯ã€ããªã¹ãæ¹åŒã®å ¥å倿€èšŒ: 蚱容ãããå ¥åãå®çŸ©ãããã®å®çŸ©ã«æºæ ããªããã®ã¯ãã¹ãŠæåŠããŸãã
- ãŠãŒã¶ãŒå ¥åã®ãµãã¿ã€ãº: ã³ãŒããããŒã¯ã¢ãããšããŠè§£éãããå¯èœæ§ã®ããæåããšã¹ã±ãŒããŸãã¯åé€ããŸããäŸãã°ã`<`ã`>`ã`&`ã`"` ã察å¿ããHTMLãšã³ãã£ãã£ã«çœ®ãæããŸãã
- ã³ã³ããã¹ããæèãããµãã¿ã€ãº: å ¥åã䜿çšãããå ŽæïŒäŸïŒHTMLãURLãJavaScriptïŒã«å¿ããŠãç°ãªããµãã¿ã€ãºæè¡ãé©çšããŸãã
äŸïŒHTMLåºåã®ããã®ãŠãŒã¶ãŒå ¥åã®ãµãã¿ã€ãº
function sanitizeHTML(input) {
const div = document.createElement('div');
div.textContent = input;
return div.innerHTML; // HTMLãšã³ãã£ãã£ãå®å
šã«ãšã³ã³ãŒã
}
const userInput = "";
const sanitizedInput = sanitizeHTML(userInput);
document.getElementById('output').innerHTML = sanitizedInput; // <script>alert('XSS')</script> ãåºå
3. èªèšŒãããŒãšãããã³ã«
é©åãªèªèšŒãããŒãšãããã³ã«ãéžæããããšã¯ãã»ãã¥ãªãã£ã«ãšã£ãŠéåžžã«éèŠã§ããçŸä»£ã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãOAuth 2.0ãOpenID Connectã®ãããªæšæºåããããããã³ã«ãããå©çšãããŸãã
- OAuth 2.0: 第äžè ã®ã¢ããªã±ãŒã·ã§ã³ããŠãŒã¶ãŒã®è³æ Œæ å ±ãå ±æããããšãªãããªãœãŒã¹ãµãŒããŒïŒäŸïŒGoogleãFacebookïŒäžã®ãŠãŒã¶ãŒãªãœãŒã¹ã«ã¢ã¯ã»ã¹ã§ããããã«ããèªå¯ãã¬ãŒã ã¯ãŒã¯ã§ãã
- OpenID Connect (OIDC): OAuth 2.0ã®äžã«æ§ç¯ãããèªèšŒã¬ã€ã€ãŒã§ããŠãŒã¶ãŒã®èº«å ã確èªããããã®æšæºåãããæ¹æ³ãæäŸããŸãã
- ãã¹ã¯ãŒãã¬ã¹èªèšŒ: ãã¹ã¯ãŒãé¢é£ã®æ»æãªã¹ã¯ãäœæžããããã«ãããžãã¯ãªã³ã¯ãçäœèªèšŒãã¯ã³ã¿ã€ã ãã¹ã¯ãŒãïŒOTPïŒãªã©ã®ãã¹ã¯ãŒãã¬ã¹èªèšŒæ¹æ³ã®å®è£ ãæ€èšããŸãã
- å€èŠçŽ èªèšŒ (MFA): ãã°ã€ã³ããã»ã¹ã«ã»ãã¥ãªãã£å±€ã远å ããããã«MFAãå®è£ ãããŠãŒã¶ãŒã«è€æ°ã®èªèšŒèŠçŽ ïŒäŸïŒãã¹ã¯ãŒãïŒOTPïŒã®æäŸãèŠæ±ããŸãã
äŸïŒOAuth 2.0 ã€ã³ããªã·ãããããŒïŒæ³šïŒã€ã³ããªã·ãããããŒã¯ã»ãã¥ãªãã£äžã®æžå¿µããçŸä»£ã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯äžè¬çã«æšå¥šãããŸãããPKCEä»ãèªå¯ã³ãŒããããŒãæšå¥šãããŸãïŒ
ã€ã³ããªã·ãããããŒã¯ãã·ã³ã°ã«ããŒãžã¢ããªã±ãŒã·ã§ã³ïŒSPAïŒã§äžè¬çã«äœ¿çšãããŠããŸãããã¢ããªã±ãŒã·ã§ã³ã¯ãŠãŒã¶ãŒãèªå¯ãµãŒããŒã«ãªãã€ã¬ã¯ãããŸããèªèšŒåŸãèªå¯ãµãŒããŒã¯URLãã©ã°ã¡ã³ãã«ã¢ã¯ã»ã¹ããŒã¯ã³ãå«ããŠãŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ã«ãªãã€ã¬ã¯ãããŸãã
// ããã¯ç°¡ç¥åãããäŸã§ãããæ¬çªç°å¢ã§ã¯äœ¿çšããªãã§ãã ããã
// 代ããã«PKCEä»ãèªå¯ã³ãŒããããŒã䜿çšããŠãã ããã
const clientId = 'YOUR_CLIENT_ID';
const redirectUri = encodeURIComponent('https://your-app.com/callback');
const authUrl = `https://authorization-server.com/oauth/authorize?client_id=${clientId}&redirect_uri=${redirectUri}&response_type=token&scope=openid profile email`;
window.location.href = authUrl;
éèŠïŒ ã€ã³ããªã·ãããããŒã«ã¯ã»ãã¥ãªãã£äžã®å¶éããããŸãïŒäŸïŒãã©ãŠã¶å±¥æŽã§ã®ããŒã¯ã³æŒæŽ©ãããŒã¯ã³ã€ã³ãžã§ã¯ã·ã§ã³ãžã®è匱æ§ïŒãPKCEïŒProof Key for Code ExchangeïŒä»ãèªå¯ã³ãŒããããŒã¯ããããã®ãªã¹ã¯ãç·©åãããããSPAã«æšå¥šãããã¢ãããŒãã§ãã
4. ã»ãã·ã§ã³ç®¡ç
é©åãªã»ãã·ã§ã³ç®¡çã¯ããŠãŒã¶ãŒã®èªèšŒç¶æ ãç¶æããã»ãã·ã§ã³ãã€ãžã£ãã¯ãé²ãããã«äžå¯æ¬ ã§ãã
- å®å šãªã»ãã·ã§ã³ID: 匷åã§äºæž¬äžå¯èœãªã»ãã·ã§ã³IDãçæããŸãã
- HttpOnlyããã³Secureã¯ãããŒ: ã»ãã·ã§ã³ã¯ãããŒã« `HttpOnly` ããã³ `Secure` 屿§ãèšå®ããŠãJavaScriptã«ããã¢ã¯ã»ã¹ãé²ããHTTPSçµç±ã§ã®éä¿¡ãä¿èšŒããŸãã
- ã»ãã·ã§ã³ã®æå¹æé: 䟵害ãããã»ãã·ã§ã³ã®åœ±é¿ãå¶éããããã«ãé©åãªã»ãã·ã§ã³æå¹æéãå®è£ ããŸããã¢ã€ãã«ã¿ã€ã ã¢ãŠããšçµ¶å¯Ÿã¿ã€ã ã¢ãŠããèæ ®ããŠãã ããã
- ã»ãã·ã§ã³ã®æŽæ°: ã»ãã·ã§ã³åºå®åæ»æãé²ãããã«ãèªèšŒæååŸã«ã»ãã·ã§ã³ãæŽæ°ããŸãã
- SameSite屿§ã®äœ¿çšãæ€èšãã: `SameSite` 屿§ã `Strict` ãŸã㯠`Lax` ã«èšå®ããŠãCSRFæ»æããä¿è·ããŸãã
äŸïŒã»ãã·ã§ã³ã¯ãããŒã®èšå®
// HttpOnlyãSecureãSameSite屿§ãæã€ã»ãã·ã§ã³ã¯ãããŒãèšå®
document.cookie = "sessionId=YOUR_SESSION_ID; HttpOnly; Secure; SameSite=Strict; Path=/";
5. XSSæ»æããã®ä¿è·
XSSæ»æã¯ããã³ããšã³ãã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠå€§ããªè åšã§ããXSSã®ãªã¹ã¯ã軜æžããããã«ã以äžã®æŠç¥ãå®è£ ããŠãã ããïŒ
- ã³ã³ãã³ãã»ãã¥ãªãã£ããªã·ãŒ (CSP): 峿 ŒãªCSPãå®è£ ããŠããã©ãŠã¶ãèªã¿èŸŒãããšãèš±å¯ãããªãœãŒã¹ãå¶åŸ¡ããŸããããã«ãããæ»æè ã«ãã£ãŠæ³šå ¥ãããæªæã®ããã¹ã¯ãªããã®å®è¡ãé²ãããšãã§ããŸãã
- å ¥åå€ã®æ€èšŒãšåºåã®ãšã³ã³ãŒãã£ã³ã°: åè¿°ã®éãããã¹ãŠã®ãŠãŒã¶ãŒå ¥åãæ€èšŒããXSSã®è匱æ§ãé²ãããã«åºåãé©åã«ãšã³ã³ãŒãããŸãã
- çµã¿èŸŒã¿ã®XSSä¿è·æ©èœãæã€ãã¬ãŒã ã¯ãŒã¯ã䜿çšãã: ReactãAngularãVue.jsãªã©ã®çŸä»£ã®ããã³ããšã³ããã¬ãŒã ã¯ãŒã¯ã¯ãXSSæ»æãé²ãããã®çµã¿èŸŒã¿ã¡ã«ããºã ãæäŸããŠããããšããããããŸãã
äŸïŒã³ã³ãã³ãã»ãã¥ãªãã£ããªã·ãŒ (CSP)
CSPã¯ãã©ã®ã³ã³ãã³ããœãŒã¹ãèªã¿èŸŒã¿ãèš±å¯ãããŠãããããã©ãŠã¶ã«äŒããHTTPããããŒã§ããããã«ããããã©ãŠã¶ãæªæã®ãããœãŒã¹ãããªãœãŒã¹ãèªã¿èŸŒãã®ãé²ããŸãã
// CSPããããŒã®äŸ
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted-cdn.com; style-src 'self' https://trusted-cdn.com; img-src 'self' data:;
6. CSRFæ»æããã®ä¿è·
CSRFæ»æã¯ããŠãŒã¶ãŒãéšããŠæå³ããªãã¢ã¯ã·ã§ã³ãå®è¡ãããããšããããŸãã以äžã®å¯Ÿçãå®è£ ããŠCSRFããä¿è·ããŠãã ããïŒ
- ã·ã³ã¯ããã€ã¶ãŒããŒã¯ã³ãã¿ãŒã³ (STP): åãŠãŒã¶ãŒã»ãã·ã§ã³ã«å¯ŸããŠäžæã§äºæž¬äžå¯èœãªããŒã¯ã³ãçæãããã¹ãŠã®ç¶æ 倿Žãªã¯ãšã¹ãã«å«ããŸãããµãŒããŒã¯ãªã¯ãšã¹ããåŠçããåã«ããŒã¯ã³ãæ€èšŒããŸãã
- SameSiteã¯ãããŒå±æ§: åè¿°ã®éãã`SameSite` 屿§ã `Strict` ãŸã㯠`Lax` ã«èšå®ããããšã§ãCSRFæ»æã®ãªã¹ã¯ãå€§å¹ ã«åæžã§ããŸãã
- ããã«ãµããããã¯ãããŒãã¿ãŒã³: ã©ã³ãã ãªå€ãæã€ã¯ãããŒãèšå®ããåãå€ããã©ãŒã ã®é ããã£ãŒã«ããšããŠå«ããŸãããµãŒããŒã¯ã¯ãããŒã®å€ãšé ããã£ãŒã«ãã®å€ãäžèŽããããšã確èªããŸãã
äŸïŒã·ã³ã¯ããã€ã¶ãŒããŒã¯ã³ãã¿ãŒã³ (STP)
- ãµãŒããŒã¯åãŠãŒã¶ãŒã»ãã·ã§ã³ã«å¯ŸããŠäžæã®CSRFããŒã¯ã³ãçæãããµãŒããŒãµã€ãã«ä¿åããŸãã
- ãµãŒããŒã¯CSRFããŒã¯ã³ãHTMLãã©ãŒã ãŸãã¯ããã³ããšã³ããã¢ã¯ã»ã¹ã§ããJavaScript倿°ã«å«ããŸãã
- ããã³ããšã³ãã¯CSRFããŒã¯ã³ããã©ãŒã ã®é ããã£ãŒã«ããšããŠããŸãã¯AJAXãªã¯ãšã¹ãã®ã«ã¹ã¿ã ããããŒãšããŠå«ããŸãã
- ãµãŒããŒã¯ãªã¯ãšã¹ãå ã®CSRFããŒã¯ã³ãã»ãã·ã§ã³ã«ä¿åãããŠããCSRFããŒã¯ã³ãšäžèŽããããšã確èªããŸãã
// ããã³ããšã³ã (JavaScript)
const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
fetch('/api/update-profile', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-Token': csrfToken // CSRFããŒã¯ã³ãã«ã¹ã¿ã ããããŒãšããŠå«ãã
},
body: JSON.stringify({ name: 'New Name' })
});
// ããã¯ãšã³ã (äŸ - ç䌌ã³ãŒã)
function verifyCSRFToken(request, session) {
const csrfTokenFromRequest = request.headers['X-CSRF-Token'];
const csrfTokenFromSession = session.csrfToken;
if (!csrfTokenFromRequest || !csrfTokenFromSession || csrfTokenFromRequest !== csrfTokenFromSession) {
throw new Error('Invalid CSRF token');
}
}
7. å®å šãªéä¿¡ (HTTPS)
çèŽãMitMæ»æãé²ãããã«ãã¯ã©ã€ã¢ã³ããšãµãŒããŒéã®ãã¹ãŠã®éä¿¡ãHTTPSã䜿çšããŠæå·åãããŠããããšã確èªããŠãã ããã
- SSL/TLSèšŒææžãååŸãã: ä¿¡é Œã§ããèšŒææžèªèšŒå±ïŒCAïŒããæå¹ãªSSL/TLSèšŒææžãååŸããŸãã
- ãµãŒããŒãèšå®ãã: ãŠã§ããµãŒããŒãèšå®ããŠHTTPSã匷å¶ãããã¹ãŠã®HTTPãªã¯ãšã¹ããHTTPSã«ãªãã€ã¬ã¯ãããŸãã
- HSTS (HTTP Strict Transport Security) ã䜿çšãã: HSTSãå®è£ ããŠããŠãŒã¶ãŒãã¢ãã¬ã¹ããŒã« `http://` ãšå ¥åããå Žåã§ãããã©ãŠã¶ãåžžã«HTTPSçµç±ã§ãŠã§ããµã€ãã«ã¢ã¯ã»ã¹ããããã«æç€ºããŸãã
äŸïŒHSTSããããŒ
// HSTSããããŒã®äŸ
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
8. ç£èŠãšãã®ã³ã°
ã»ãã¥ãªãã£ã€ã³ã·ãã³ããæ€åºã察å¿ããããã«ãå æ¬çãªç£èŠãšãã®ã³ã°ãå®è£ ããŸãããã¹ãŠã®èªèšŒè©Šè¡ãèªå¯å€±æãããã³ãã®ä»ã®ã»ãã¥ãªãã£é¢é£ã€ãã³ãããã°ã«èšé²ããŸãã
- éäžãã®ã³ã°: éäžãã®ã³ã°ã·ã¹ãã ã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®ã³ã³ããŒãã³ããããã°ãåéããŸãã
- ã¢ã©ãŒã: è€æ°åã®ãã°ã€ã³å€±æãç°åžžãªã¢ã¯ã»ã¹ãã¿ãŒã³ãªã©ãäžå¯©ãªã¢ã¯ãã£ããã£ãéç¥ããã¢ã©ãŒããèšå®ããŸãã
- 宿çãªã»ãã¥ãªãã£ç£æ»: 宿çãªã»ãã¥ãªãã£ç£æ»ã宿œããŠãã¢ããªã±ãŒã·ã§ã³ã®è匱æ§ãç¹å®ãã察åŠããŸãã
é«åºŠãªèæ ®äºé
1. ãã§ãã¬ãŒã·ã§ã³ID管ç (FIM)
è€æ°ã®IDãããã€ããŒïŒäŸïŒãœãŒã·ã£ã«ãã°ã€ã³ïŒãšçµ±åããå¿ èŠãããã¢ããªã±ãŒã·ã§ã³ã®å Žåããã§ãã¬ãŒã·ã§ã³ID管çïŒFIMïŒã·ã¹ãã ã®äœ¿çšãæ€èšããŠãã ãããFIMã«ããããŠãŒã¶ãŒã¯ä¿¡é Œã§ããIDãããã€ããŒã®æ¢åã®è³æ Œæ å ±ã䜿çšããŠèªèšŒã§ããããããã°ã€ã³ããã»ã¹ãç°¡çŽ åãããã»ãã¥ãªãã£ãåäžããŸãã
2. Web Authentication (WebAuthn)
WebAuthnã¯ãããŒããŠã§ã¢ã»ãã¥ãªãã£ããŒïŒäŸïŒYubiKeyïŒããã©ãããã©ãŒã èªèšŒåšïŒäŸïŒæçŽã»ã³ãµãŒãé¡èªèïŒã䜿çšããŠã匷åã§ãã¹ã¯ãŒãã¬ã¹ãªèªèšŒãå¯èœã«ããçŸä»£ã®ãŠã§ãæšæºã§ããWebAuthnã¯ãåŸæ¥ã®ãã¹ã¯ãŒããšæ¯èŒããŠãããå®å šã§ãŠãŒã¶ãŒãã¬ã³ããªãŒãªèªèšŒäœéšãæäŸããŸãã
3. ãªã¹ã¯ããŒã¹èªèšŒ
ãªã¹ã¯ããŒã¹èªèšŒãå®è£ ããŠãç¹å®ã®ãã°ã€ã³è©Šè¡ã«é¢é£ãããªã¹ã¯ã«åºã¥ããŠã»ãã¥ãªãã£ã¬ãã«ãåçã«èª¿æŽããŸããäŸãã°ããŠãŒã¶ãŒãæ°ããå Žæãããã€ã¹ãããã°ã€ã³ããŠããå Žåã远å ã®èªèšŒã¹ãããïŒäŸïŒMFAïŒãå®äºããããã«èŠæ±ããããšããããŸãã
4. ãã©ãŠã¶ã»ãã¥ãªãã£ããããŒ
ãã©ãŠã¶ã»ãã¥ãªãã£ããããŒã掻çšããŠãã¢ããªã±ãŒã·ã§ã³ã®ã»ãã¥ãªãã£ã匷åããŸãããããã®ããããŒã¯ãXSSãã¯ãªãã¯ãžã£ããã³ã°ãMitMæ»æãªã©ãããŸããŸãªæ»æãé²ãã®ã«åœ¹ç«ã¡ãŸãã
- X-Frame-Options: ãŠã§ããµã€ãããã¬ãŒã ã«åã蟌ãŸãããã©ãããå¶åŸ¡ããããšã«ãããã¯ãªãã¯ãžã£ããã³ã°æ»æããä¿è·ããŸãã
- X-Content-Type-Options: XSSæ»æã«ã€ãªããå¯èœæ§ã®ããMIMEã¹ãããã£ã³ã°ãé²ããŸãã
- Referrer-Policy: ãªã¯ãšã¹ããšãšãã«éä¿¡ããããªãã¡ã©ãŒæ å ±ã®éãå¶åŸ¡ããŸãã
- Permissions-Policy: ãŠã§ããµã€ãã§å©çšå¯èœãªãã©ãŠã¶ã®æ©èœãå¶åŸ¡ã§ããŸãã
å®è£ ã«é¢ããèæ ®äºé
ããã³ããšã³ãè³æ Œæ å ±ç®¡çã»ãã¥ãªãã£ãšã³ãžã³ã®å®è£ ã«ã¯ãæ éãªèšç»ãšå®è¡ãå¿ èŠã§ãã以äžã¯ããã€ãã®éèŠãªèæ ®äºé ã§ãïŒ
- é©åãªæè¡ãéžæãã: ã¢ããªã±ãŒã·ã§ã³ã®ããŒãºãšã»ãã¥ãªãã£èŠä»¶ã«é©ããæè¡ãšã©ã€ãã©ãªãéžæããŸããå®è£ ããã»ã¹ãç°¡çŽ åããããã«ãè©å€ã®è¯ãèªèšŒã©ã€ãã©ãªããã¬ãŒã ã¯ãŒã¯ã®äœ¿çšãæ€èšããŠãã ããã
- ã»ãã¥ãªãã£ã®ãã¹ããã©ã¯ãã£ã¹ã«åŸã: éçºããã»ã¹å šäœãéããŠã»ãã¥ãªãã£ã®ãã¹ããã©ã¯ãã£ã¹ãéµå®ããŸãã宿çã«ã³ãŒãã®è匱æ§ãã¬ãã¥ãŒããã»ãã¥ãªãã£ãã¹ãã宿œããŸãã
- ææ°ã®ç¶æ ãä¿ã€: äŸåé¢ä¿ãææ°ã®ç¶æ ã«ä¿ã¡ãææ°ã®ã»ãã¥ãªãã£ããããé©çšãããŠããããšã確èªããŸããã»ãã¥ãªãã£ã¢ããã€ã¶ãªã賌èªããæ°ããè匱æ§ãç£èŠããŸãã
- ããŒã ãæè²ãã: éçºããŒã ã«ã»ãã¥ãªãã£ã®ãã¹ããã©ã¯ãã£ã¹ãšå®å šãªã³ãŒãã£ã³ã°ã®éèŠæ§ã«ã€ããŠãã¬ãŒãã³ã°ããŸããæ°ããªè åšãè匱æ§ã«ã€ããŠåžžã«æ å ±ãåŸãããã«å¥šå±ããŸãã
- 宿çãªç£æ»ãšãã¹ã: 宿çãªã»ãã¥ãªãã£ç£æ»ãšäŸµå ¥ãã¹ãã宿œããŠãã¢ããªã±ãŒã·ã§ã³ã®è匱æ§ãç¹å®ãã察åŠããŸãã
- ãŠãŒã¶ãŒæè²: 匷åãªãã¹ã¯ãŒãã®äœ¿çšããã£ãã·ã³ã°è©æ¬ºã®åé¿ãªã©ãå®å šãªãªã³ã©ã€ã³ç¿æ £ã«ã€ããŠãŠãŒã¶ãŒãæè²ããŸãã
èªèšŒã«é¢ããã°ããŒãã«ãªèæ ®äºé
ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã®èªèšŒã·ã¹ãã ãæ§ç¯ããéã«ã¯ããããã®èŠå ãèæ ®ããŠãã ããïŒ
- èšèªãµããŒã: èªèšŒãããŒãšãšã©ãŒã¡ãã»ãŒãžãç°ãªãèšèªã«ããŒã«ã©ã€ãºãããŠããããšã確èªããŸãã
- æåçæåæ§: ãã¹ã¯ãŒãèŠä»¶ãèªèšŒã®å¥œã¿ã«ãããæåçãªéãã«æ³šæããŸãã
- ããŒã¿ãã©ã€ãã·ãŒèŠå¶: ãŠãŒã¶ãŒãæåšããå°åã§é¢é£ããGDPRïŒãšãŒãããïŒãCCPAïŒã«ãªãã©ã«ãã¢ïŒãªã©ã®ããŒã¿ãã©ã€ãã·ãŒèŠå¶ã«æºæ ããŸãã
- ã¿ã€ã ãŸãŒã³: ã»ãã·ã§ã³ã®æå¹æéãããã¯ã¢ãŠãããªã·ãŒã管çããéã«ãç°ãªãã¿ã€ã ãŸãŒã³ãèæ ®ããŸãã
- ã¢ã¯ã»ã·ããªãã£: èªèšŒãããŒãé害ã®ãããŠãŒã¶ãŒã«ãã¢ã¯ã»ã¹ããããããŸãã
äŸïŒã°ããŒãã«ãŠãŒã¶ãŒåãã®ãã¹ã¯ãŒãèŠä»¶ã®é©å¿
äžéšã®æåã§ã¯ããŠãŒã¶ãŒã¯è€éãªãã¹ã¯ãŒãèŠä»¶ã«æ £ããŠããªãå ŽåããããŸããã»ãã¥ãªãã£ãšäœ¿ããããã®ãã©ã³ã¹ãåãããã«ãã¹ã¯ãŒãããªã·ãŒã調æŽããæç¢ºãªã¬ã€ãã³ã¹ãšãã¹ã¯ãŒãå埩ã®ãªãã·ã§ã³ãæäŸããŸãã
çµè«
ããã³ããšã³ãã®è³æ Œæ å ±ç®¡çãä¿è·ããããšã¯ãçŸä»£ã®ãŠã§ãã¢ããªã±ãŒã·ã§ã³ã»ãã¥ãªãã£ã®éèŠãªåŽé¢ã§ããå ç¢ãªããã³ããšã³ãè³æ Œæ å ±ç®¡çã»ãã¥ãªãã£ãšã³ãžã³ãå®è£ ããããšã§ããŠãŒã¶ãŒã®è³æ Œæ å ±ãä¿è·ããããŸããŸãªæ»æãé²ããã¢ããªã±ãŒã·ã§ã³ã®å®å šæ§ã確ä¿ã§ããŸããã»ãã¥ãªãã£ã¯ç¶ç¶çãªç£èŠããã¹ãããããŠé²åããè åšã®ç¶æ³ãžã®é©å¿ãå¿ èŠãšããé²è¡äžã®ããã»ã¹ã§ããããšãå¿ããªãã§ãã ããããã®ã¬ã€ãã§æŠèª¬ãããååãåãå ¥ããããšã§ãã¢ããªã±ãŒã·ã§ã³ã®ã»ãã¥ãªãã£äœå¶ãå€§å¹ ã«åŒ·åããããŠãŒã¶ãŒãå±å®³ããå®ãããšãã§ããŸãã