はじめに
こんにちは、みんみんです。
Goを使ってみたい。でも実務経験はゼロ。
それでも「JWT認証付きのWeb APIを1日で作れる」という話を聞いて、やってみることにしました。
今回は、Go初心者の私が認証機能付きWebアプリを1日で構築した体験談を共有します。
使用技術スタック
- Go 1.23
- HTML + JavaScript(Vanilla)
- JWT(github.com/golang-jwt/jwt/v5)
- bcrypt(golang.org/x/crypto)
- golangci-lint(ローカル検証)
実装した機能
- サインアップ(パスワードはbcryptでハッシュ化)
- ログイン(JWTトークンを発行)
- 認証付きプロフィールページ(ログインしないとアクセス不可)
- 売上の登録/一覧表示(ログイン中のユーザーごとに分離)
- 表形式での売上表示(合計金額の算出、日付順にソート)
- ログアウト処理
ディレクトリ構成
├── go.mod // Goモジュール定義
├── go.sum // Goモジュール定義
├── main.go // エントリーポイント
├── models/
│ └── user.go // ユーザーモデル(Claims構造体など)
│ └── sale.go // 売上モデル
├── handlers/
│ └── auth.go // ログイン・サインアップ・プロフィール取得
│ └── sales.go // 売上登録・取得
├── static/
│ └── login.html // ログイン画面
│ └── signup.html // サインアップ画面
│ └── profile.html // 認証後プロフィール画面
│ └── sales.html // 売上登録&表示画面
実際の画面イメージ
詰まったポイントと解決法
401 Unauthorized が出続ける
→ 原因は「Bearer 」のスペース忘れ or トークンの形式ミス。Authorization: Bearer xxx の形式を正しく保つ必要あり。
Error return value of (*encoding/json.Encoder).Encode is not checked (errcheck)がたくさん出る
→ 原因はエラーの可能性がある箇所をちゃんと見直さなかったこと。エラーの可能性があるならかならずエラー時の対応を書かないとgolangci-lintに引っかかる。
学び・感想
- Goは文法がシンプルで読みやすく、API実装にも向いている
- JWTの使い方が理解できた(トークン発行→保存→検証の流れ)
- Webアプリの基本的な構造が把握できた
- Linterのエラーが意外と強力で、ちゃんと直すとコードも綺麗になる
- なにより「1日でここまでできる」という成功体験は大きい
次にやりたいこと
- データの永続化(SQLiteやPostgreSQL)
- テストコードの整備(特にハンドラ部分)
- CIの安定化(golangci-lintの通過)
- フロントをReactやVueなどに置き換えてSPA化
最後に
「Go興味あるけど何から始めればいいの?」という方には、JWT付きWeb APIの構築はとてもおすすめです。
短時間で達成感があり、Webの基本構造やセキュリティの勘所も学べると思います。
これからもGo言語学習を進めていきたいので、もしおすすめの学習法などございましたら、ぜひコメントいただけますと嬉しいです!