무지개곰
article thumbnail

목차

  1. 로그인 과정 Flow chart
  2. 기술 스택 Flow chart
  3. 미들웨어로 관리자 확인
  4. 겪은 문제
  5. 작업을 통해 배운 것
  6. 결과

로그인 과정 Flow chart


미들웨어로 관리자 확인

기술 스택에 대한 DB 요청은 관리자 로그인을 확인하는 과정이 필요하다고 판단
각 요청마다 admin_login cookie를 통하여 관리자를 확인하는 방법보다 공통된 작업을 처리해 주는 미들웨어를 선택

gorila/mux에서 미들웨어

adminRouter := r.PathPrefix("/access").Subrouter()
adminRouter.Use(Middleware.AdminMiddleware)
AccessRequest(adminRouter)   

미들웨어

func AdminMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
        session, err := Session.Store.Get(req, "admin_login")
        Admin_id := session.Values["admin_login"]
        if err != nil {
            http.Error(res, err.Error(), http.StatusInternalServerError)
            return
        }

        if Admin_id != "" {
            next.ServeHTTP(res, req)
        } else {
            http.Error(res, "Unauthorized", http.StatusUnauthorized)
        }
    })
}

기술 스택 Flow chart


겪은 문제

Mysql.DB.QueryRow("SELECT Rank, Password FROM admin_user WHERE Admin_id = ?", UserID).Scan(&Rank, &Password)

Query문을 통하여 Rank와 Password를 불러오는 과정에서 query문에 문제가 있다는 오류

오류 내용

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near

해결

Mysql.DB.QueryRow("SELECT `Rank`, `Password` FROM admin_user WHERE Admin_id = ?", UserID).Scan(&Rank, &Password)

원인은 컬럼 하나가 아닌 여러 컬럼을 불러오는 경우 apostrophe ( ` )를 사용하여 컬럼 명을 구분해주어야 합니다.
컬럼이 구분되지 않으니 하나의 컬럼으로 인식하여 문법에 오류가 있다고 판단하여 오류를 내보냈습니다.

참고 자료

https://stackoverflow.com/questions/66414376/golang-mysql-server-version-for-the-right-syntax-to-use-near-at-line-1


작업을 하며 배운 것

bcrypto

로그인 작업을 위하여 비밀번호를 암호화하는 방법을 찾게 되었습니다.
이전에 Node.js를 다룰 때 사용한 SHA256을 통한 암호화가 떠올라 golang에서 SHA256 암호화 방법을 찾아보는 와중에 bcrypto를 알게 되었습니다.

bcrypto란?

레인보우 테이블 공격 방지를 위해 솔트를 통합한 bcrypto는 적응형 함수의 하나
시간이 지남에 따라 속도 저하를 위해 반복 횟수 증가가 수반될 수 있으므로 연산 파워의 증가에도 브루트 포스 검색 공격에 대한 저항을 유지

 

예시

$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy

2a : 해시 알고리즘 식별자
10 : Cost Factor
N9qo8uLOickgx2ZMRZoMye : 16바이트 솔트
IjZAgcfl7p92ldGxad68LJZdL17lhWy : 24바이트 해시

bcrypto 작동 원리

암호화하고 싶은 자료와 솔트를 합쳐 해시 함수를 통하여 해시화 합니다.
Cost Factor의 수만큼 반복합니다. (2^Cost Factor)

예시

  1. 0000을 솔트와 연결 => 0000N9qo8uLOickgx2ZMRZoMye
  2. Cost Factor 만큼 해시 작업을 반복 (2^Cost Factor)
  3. 사용한 해시 알고리즘, Cost Factor, 솔트, 해시 결과를 합쳐서 출력 => $2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy

결과

  1. 카카오 로그인 이후 /admin으로 이동하여 로그인
  2. admin id와 rank를 확인
  3. 관리자 로그아웃 이후 /admin 관련 path로 접근 시 /admin로 강제 이동
  4. 카카오 로그아웃 이후 /admin 접근 시 /로 강제 이동

  1. 추가 버튼으로 기술 추가
  2. 수정을 통하여 값 수정
  3. 중복된 코드 입력 시 alter로 경고
profile

무지개곰

@무지개곰

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!