BackEnd🌱/DB & SQL

[MySQL] μ‚¬μš©μž 생성 및 κΆŒν•œ λΆ€μ—¬ 방법

μ•ˆμ£Όν˜• 2023. 10. 6. 01:16

[κ°œμš”]

MySQL은 μ‚¬μš©μž κ³„μ •μ˜ 관리 방식이 λ‹€λ₯Έ DBMS와 μ•½κ°„ 차이가 μžˆμŠ΅λ‹ˆλ‹€ λ§Žμ€ DBMSμ—μ„œλŠ” μ•„μ΄λ””λ‘œ μ‚¬μš©μžλ₯Ό μ‹λ³„ν•˜μ§€λ§Œ, MySQL은 μ‚¬μš©μž 아이디 외에도 μ ‘μ†ν•˜λŠ” IP μ£Όμ†Œλ₯Ό ν•¨κ»˜ κ³ λ €ν•˜μ—¬ λ”μš± μ •λ°€ν•œ μ ‘κ·Ό μ œμ–΄λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. λ˜ν•œ, MySQL 8.0 λ²„μ „λΆ€ν„°λŠ” 'μ—­ν• (ROLE)'μ΄λΌλŠ” κ°œλ…λ„ λ„μž…λ˜μ—ˆκ³ , 이λ₯Ό 톡해 미리 μ •μ˜λœ κΆŒν•œ κ·Έλ£Ή, 즉 'Role'을 μ‚¬μš©μžμ—κ²Œ μ‰½κ²Œ λΆ€μ—¬ν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

 

[μ‚¬μš©μž 식별]

계정과 호슀트λͺ…

λŒ€λΆ€λΆ„μ˜ DBMSλŠ” 계정 μ΄λ¦„λ§ŒμœΌλ‘œ μ‚¬μš©μžλ₯Ό μ‹λ³„ν•˜μ§€λ§Œ, MySQL은 μ‚¬μš©μžμ˜ 계정과 접속 지점(ν΄λΌμ΄μ–ΈνŠΈ 호슀트λͺ…, 도메인, IP μ£Όμ†Œ)을 λ™μ‹œμ— κ³ λ €ν•©λ‹ˆλ‹€. λ”°λΌμ„œ MySQL 계정을 μ–ΈκΈ‰ν•  λ•ŒλŠ” μ•„λž˜μ˜ 예처럼 아이디와 호슀트 정보λ₯Ό λͺ…μ‹œν•΄μ•Ό ν•©λ‹ˆλ‹€.

'svc_id'@'127.0.0.1'

μœ„ μ˜ˆμ‹œλŠ” 'svc_id' 계정이 MySQL μ„œλ²„κ°€ λ™μž‘ 쀑인 둜컬 ν˜ΈμŠ€νŠΈμ—μ„œλ§Œ 접속할 수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. λ§Œμ•½ λ‹€λ₯Έ μ»΄ν“¨ν„°μ—μ„œ 'svc_id'둜 μ ‘μ†ν•˜λ €κ³  ν•œλ‹€λ©΄, 이 계정 μ •λ³΄λ‘œλŠ” 접속할 수 μ—†μŠ΅λ‹ˆλ‹€.

μ™ΈλΆ€ 접속을 ν—ˆμš©ν•˜λ €λ©΄ 호슀트 뢀뢄을 %둜 λŒ€μ²΄ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ΄λ•Œμ˜ %λŠ” λͺ¨λ“  IPλ‚˜ 호슀트λͺ…을 μ˜λ―Έν•©λ‹ˆλ‹€.

 

μ€‘λ³΅λœ 계정λͺ… 주의

μ‚¬μš©μž 계정을 식별할 λ•Œ μ€‘μš”ν•œ 점이 μžˆλŠ”λ°, λ°”λ‘œ λ™μΌν•œ 아이디λ₯Ό κ°€μ§€λŠ” κ²½μš°μž…λ‹ˆλ‹€. MySQL μ„œλ²„λŠ” λ™μΌν•œ 아이디λ₯Ό 가진 μ—¬λŸ¬ 계정이 μžˆμ„ 경우 λ¬Έμ œκ°€ μƒκΈ°λŠ”λ°, MySQL은 λ™μΌν•œ 아이디λ₯Ό κ°€μ§€λŠ” 정보가 μžˆμ„ λ•Œ λ²”μœ„κ°€ 쒁은 계정을 μ„ νƒν•©λ‹ˆλ‹€.

'svc_id'@'192.168.0.10' -- λΉ„λ°€λ²ˆν˜Έ: 123
'svc_id'@'%' -- λΉ„λ°€λ²ˆν˜Έ: abc

μœ„μ™€ 같은 계정 정보가 μžˆμ„ λ•Œ, '192.168.0.10' IP둜 접속을 μ‹œλ„ν•˜λ©΄, MySQL은 λ²”μœ„κ°€ 쒁은 'svc_id'@'192.168.0.10' 계정을 μš°μ„  μΈμ¦ν•˜λ €κ³  ν•©λ‹ˆλ‹€. 이 μƒν™©μ—μ„œ 'svc_id' κ³„μ •μœΌλ‘œ 'abc' λΉ„λ°€λ²ˆν˜Έλ‘œ λ‘œκ·ΈμΈμ„ μ‹œλ„ν•˜λ©΄ 'λΉ„λ°€λ²ˆν˜Έ 뢈일치' 였λ₯˜κ°€ λ°œμƒν•˜κ²Œ λ©λ‹ˆλ‹€. 이처럼 μ€‘μ²©λœ 계정 섀정은 μ£Όμ˜κ°€ ν•„μš”ν•©λ‹ˆλ‹€.

 

 

[μ‚¬μš©μž 계정 관리]

μ‹œμŠ€ν…œ 계정과 일반 계정

MySQL 8.0λΆ€ν„° 계정은 'SYSTEM_USER' κΆŒν•œμ˜ μœ λ¬΄μ— 따라 μ‹œμŠ€ν…œ 계정과 일반 κ³„μ •μœΌλ‘œ λ‚˜λ‰©λ‹ˆλ‹€. μ‹œμŠ€ν…œ 계정은 μ„œλ²„ 내뢀적인 λ°±κ·ΈλΌμš΄λ“œ μŠ€λ ˆλ“œμ™€λŠ” 연관이 μ—†μœΌλ©°, 이 계정은 λ°μ΄ν„°λ² μ΄μŠ€ κ΄€λ¦¬μžμš©μž…λ‹ˆλ‹€. 반면 일반 계정은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‚¬μš©μžλ‚˜ 개발자λ₯Ό μœ„ν•œ κ²ƒμž…λ‹ˆλ‹€.

μ‹œμŠ€ν…œ 계정은 λͺ¨λ“  κ³„μ •μ˜ 관리 κΆŒν•œμ„ 가지며, λ‹€μŒκ³Ό 같은 μ€‘μš”ν•œ 관리 μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • 계정 관리(계정 생성, μ‚­μ œ 및 κΆŒν•œ μ„€μ •)
  • λ‹€λ₯Έ μ„Έμ…˜ λ˜λŠ” 쿼리의 κ°•μ œ μ’…λ£Œ
  • μŠ€ν† μ–΄λ“œ ν”„λ‘œκ·Έλž¨ 생성 μ‹œ, λ‹€λ₯Έ μ‚¬μš©μžλ₯Ό DEFINER둜 지정

μ΄λŸ¬ν•œ ꡬ뢄은 DBA κ³„μ •μ—λ§Œ 'SYSTEM_USER' κΆŒν•œμ„ λΆ€μ—¬ν•˜κ³  일반 μ‚¬μš©μžμ—κ²ŒλŠ” λΆ€μ—¬ν•˜μ§€ μ•ŠκΈ° μœ„ν•¨μž…λ‹ˆλ‹€.

λ˜ν•œ MySQL μ„œλ²„μ—λŠ” 기본적으둜 μ œκ³΅λ˜λŠ” λ‹€μŒκ³Ό 같은 λ‚΄μž₯ 계정듀이 μžˆμŠ΅λ‹ˆλ‹€. 그쀑 'root'@'localhost'λ₯Ό μ œμ™Έν•˜λ©΄, λ‚˜λ¨Έμ§€ 계정듀은 νŠΉμ • λͺ©μ μœΌλ‘œ μ‚¬μš©λ˜λ―€λ‘œ μ‚­μ œν•˜μ§€ μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€.

  • 'mysql.sys'@'localhost': MySQL 8.0λΆ€ν„° 제곡되며, sys μŠ€ν‚€λ§ˆ 객체의 DEFINER둜 μ‚¬μš©λ©λ‹ˆλ‹€.
  • 'mysql.session'@'localhost': MySQL ν”ŒλŸ¬κ·ΈμΈμ΄ μ ‘κ·Όμš© κ³„μ •μž…λ‹ˆλ‹€.
  • 'mysql.infoschema'@'localhost': information_schema뷰의 DEFINER둜 μ‚¬μš©λ©λ‹ˆλ‹€.

μœ„μ— μ–ΈκΈ‰ν•œ 3개의 계정은 기본적으둜 잠겨(account_locked 칼럼) μžˆλŠ” μƒνƒœμ΄λ―€λ‘œ μ˜λ„μ μœΌλ‘œ 잠긴 계정을 풀지 μ•ŠλŠ” ν•œ μ•…μ˜μ μœΌλ‘œ μ‚¬μš©λ  걱정은 ν•˜μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€.

 

 

계정 생성

MySQL 5.7κΉŒμ§€λŠ” 'GRANT' λͺ…λ Ήμ–΄λ‘œ κΆŒν•œμ„ λΆ€μ—¬ν•˜λ©΄μ„œ λ™μ‹œμ— 계정을 생성할 수 μžˆμ—ˆμ§€λ§Œ, MySQL 8.0λΆ€ν„°λŠ” 계정 생성을 μœ„ν•œ 'CREATE USER' λͺ…λ Ήκ³Ό κΆŒν•œ λΆ€μ—¬λ₯Ό μœ„ν•œ 'GRANT' λͺ…λ ΉμœΌλ‘œ κ΅¬λΆ„ν•˜μ—¬ μ‹€ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€.

계정 생성 μ‹œ λ‹€μŒκ³Ό 같은 μ˜΅μ…˜μ„ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • κ³„μ •μ˜ 인증 방식과 λΉ„λ°€λ²ˆν˜Έ
  • λΉ„λ°€λ²ˆν˜Έ κ΄€λ ¨ μ˜΅μ…˜(λΉ„λ°€λ²ˆν˜Έ 유효 κΈ°κ°„, λΉ„λ°€λ²ˆν˜Έ 이λ ₯ 개수, λΉ„λ°€λ²ˆν˜Έ μž¬μ‚¬μš© λΆˆκ°€ μ‹œκ°„)
  • κΈ°λ³Έ μ—­ν• (Role)
  • SSL μ˜΅μ…˜
  • 계정 잠금 μ—¬λΆ€

λ‹€μŒμ€ 일반적으둜 자주 μ‚¬μš©λ˜λŠ” 'CREATE USER' λͺ…λ Ήμ˜ μ˜ˆμ‹œμž…λ‹ˆλ‹€.

CREATE USER 'user'@'%'
IDENTIFIED WITH 'mysql_native_password' BY 'password'
REQUIRE NONE
PASSWORD EXPIRE INTERVAL 30 DAY
ACCOUNT UNLOCK
PASSWORD HISTORY DEFAULT
PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT;

μœ„ 예제의 각 μ˜΅μ…˜μ„ ν•˜λ‚˜μ”© μ‚΄νŽ΄λ΄…μ‹œλ‹€.

 

IDENTIFIED WITH

μ‚¬μš©μžμ˜ 인증 방식과 λΉ„λ°€λ²ˆν˜Έλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€. MySQL μ„œλ²„μ—μ„œ μ œκ³΅ν•˜λŠ” λ‹€μ–‘ν•œ 인증 방식 쀑 ν•˜λ‚˜λ₯Ό 선택할 수 μžˆλŠ”λ°, μ£Όμš” 방식은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. Native Pluggable Authentication: MySQL 5.7κΉŒμ§€μ˜ κΈ°λ³Έ λ°©μ‹μœΌλ‘œ, SHA-1 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•΄ λΉ„λ°€λ²ˆν˜Έ ν•΄μ‹œκ°’μ„ μ €μž₯ν•˜κ³  μΈμ¦ν•©λ‹ˆλ‹€.
  2. Cacging SHA-2 Pluggable Authentication: MySQL 8.0의 κΈ°λ³Έ 인증 λ°©μ‹μœΌλ‘œ, λ³΄μ•ˆμ„±μ΄ 높은 SHA-2 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•©λ‹ˆλ‹€. 이 방식은 ν•΄μ‹œκ°’ 계산에 μ‹œκ°„μ΄ 많이 μ†Œμš”λ˜λ―€λ‘œ, μ΅œμ ν™”λ₯Ό μœ„ν•΄ ν•΄μ‹œκ°’μ„ λ©”λͺ¨λ¦¬μ— μΊμ‹±ν•©λ‹ˆλ‹€.
  3. PAM pluggable Authentication: μœ λ‹‰μŠ€λ‚˜ λ¦¬λˆ…μŠ€μ˜ νŒ¨μŠ€μ›Œλ“œ λ˜λŠ” LDAPλ₯Ό μ‚¬μš©ν•˜λŠ” λ°©μ‹μœΌλ‘œ, MySQL μ—”ν„°ν”„λΌμ΄μ¦ˆ μ—λ””μ…˜μ—λ§Œ μ œκ³΅λ©λ‹ˆλ‹€.
  4. LDAP pluggable Authentication: LDAP 인증을 μ‚¬μš©ν•˜λŠ” λ°©μ‹μœΌλ‘œ, MySQL μ—”ν„°ν”„λΌμ΄μ¦ˆ μ—λ””μ…˜μ—μ„œλ§Œ μ œκ³΅λ©λ‹ˆλ‹€.

MySQL 5.7 λ²„μ „κΉŒμ§€λŠ” Native Authentication이 κΈ°λ³Έ 인증 λ°©μ‹μœΌλ‘œ μ‚¬μš©λμ§€λ§Œ MySQL. 8.0 버 μ „λΆ€ν„°λŠ” Caching SHA-2 Authentication이 κΈ°λ³Έ 인증으둜 λ°”λ€Œμ—ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ ν˜Έν™˜μ„± 문제둜 인해 Native Authentication 방식을 계속 μ‚¬μš©ν•˜λ €λŠ” 경우 μ•„λž˜μ™€ 같이 μ„€μ • 변경이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

--// Native Authentication을 κΈ°λ³Έ 인증 λ°©μ‹μœΌλ‘œ μ„€μ •
SET GLOBAL default_authentication_plugin="mysql_native_password";

 

주의 사항

MySQL의 Caching SHA-2 Pluggable Authentication 방식은 SCRAM 인증을 μ‚¬μš©ν•˜λ©°, μ΄λŠ” 평문 λΉ„λ°€λ²ˆν˜Έλ₯Ό μ—¬λŸ¬ 번 μ•”ν˜Έν™”ν•˜μ—¬ 무차별 λŒ€μž… 곡격을 λ°©μ§€ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ΄λŸ¬ν•œ 방식은 일반적인 μ‚¬μš©μžλ‚˜ μ‘μš© ν”„λ‘œκ·Έλž¨μ˜ μ—°κ²° 속도λ₯Ό 느리게 λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. SCRAM 인증의 ν•΄μ‹œ ν•¨μˆ˜ μ‹€ν–‰ νšŸμˆ˜λŠ” 'sha2_password_digest_rounds' λ³€μˆ˜λ‘œ 섀정이 κ°€λŠ₯ν•˜λ©°, κΈ°λ³Έ 값은 5000μž…λ‹ˆλ‹€.

 

REQUIRE

MySQL μ„œλ²„μ— 접속 μ‹œ SSL/TLS μ•”ν˜Έν™” μ±„λ„μ˜ μ‚¬μš© μ—¬λΆ€λ₯Ό κ²°μ •ν•©λ‹ˆλ‹€. μ„€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ 기본적으둜 λΉ„μ•”ν˜Έν™” μ±„λ„λ‘œ μ—°κ²°λ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 'REQUIRE' μ˜΅μ…˜μ„ SSL둜 μ„€μ •ν•˜μ§€ μ•Šλ”λΌλ„ Caching SHA-2 Authentication 방식을 μ‚¬μš©ν•˜λ©΄ MySQL μ„œλ²„ 접속 μ‹œ μ•”ν˜Έν™” μ±„λ„λ§Œ ν—ˆμš©λ©λ‹ˆλ‹€.

 

PASSWORD EXPIRE

λΉ„λ°€λ²ˆν˜Έμ˜ 유효 기간을 μ„€μ •ν•˜λŠ” μ˜΅μ…˜μ΄λ©°, λ³„λ„λ‘œ μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ default_password_lifetime μ‹œμŠ€ν…œ λ³€μˆ˜μ— μ €μž₯된 기간이 μ μš©λ©λ‹ˆλ‹€. λΉ„λ°€λ²ˆν˜Έ μœ νš¨κΈ°κ°„ 섀정은 κ΄€λ¦¬μžλ‚˜ 개발자 κ³„μ •μ—λŠ” ꢌμž₯λ˜μ§€λ§Œ, μ‘μš© ν”„λ‘œκ·Έλž¨ κ³„μ •μ—λŠ” μ£Όμ˜κ°€ ν•„μš”ν•©λ‹ˆλ‹€.

PASSWORD EXPIRE μ ˆμ— μ„€μ • κ°€λŠ₯ν•œ μ˜΅μ…˜μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • PASSWORD EXPIRE: 계정을 생성할 λ•Œ λΉ„λ°€λ²ˆν˜Έ μ¦‰μ‹œ 만료
  • PASSWORD EXPIRE NEVER: λΉ„λ°€λ²ˆν˜Έ 만료 μ—†μŒ
  • PASSWORD EXPIRE DEFAULT: default_password_lifetime μ‹œμŠ€ν…œ λ³€μˆ˜μ— μ €μž₯된 κΈ°κ°„μœΌλ‘œ μœ νš¨κΈ°κ°„ μ„€μ •
  • PASSWORD EXPIRE INTERVAL n DAY: μ˜€λŠ˜λΆ€ν„° n일 ν›„ 만료

 

PASSWORD HISTORY

ν•œ 번 μ‚¬μš©ν–ˆλ˜ λΉ„λ°€λ²ˆν˜Έλ₯Ό μž¬μ‚¬μš©ν•˜μ§€ λͺ»ν•˜κ²Œ μ„€μ •ν•˜λŠ” μ˜΅μ…˜μœΌλ‘œ, PASSWORD HISTORY μ ˆμ— μ„€μ • κ°€λŠ₯ν•œ μ˜΅μ…˜μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • PASSWORD HISTORY DEFAULT: μ‹œμŠ€ν…œ λ²ˆμˆ˜μ— μ§€μ •λœ 개수만큼의 이전 λΉ„λ°€λ²ˆν˜Έλ₯Ό μ €μž₯ν•˜λ©°, μ €μž₯된 이λ ₯ μ•ˆμ˜ λΉ„λ°€λ²ˆν˜ΈλŠ” μž¬μ‚¬μš© λΆˆκ°€
  • PASSWORD HISTORY n: 졜근 n개의 λΉ„λ°€λ²ˆν˜Έλ§Œ μ €μž₯ν•˜λ©°, μ €μž₯된 λΉ„λ°€λ²ˆν˜ΈλŠ” μž¬μ‚¬μš© λΆˆκ°€

ν•œ 번 μ‚¬μš©ν–ˆλ˜ λΉ„λ°€λ²ˆν˜Έλ₯Ό μ‚¬μš©ν•˜μ§€ λͺ»ν•˜κ²Œ ν•˜λ €λ©΄ 이전에 μ‚¬μš©ν–ˆλ˜ λΉ„λ°€λ²ˆν˜Έλ₯Ό MySQL μ„œλ²„κ°€ κΈ°μ–΅ν•˜κ³  μžˆμ–΄μ•Ό ν•˜λŠ”λ°, 이λ₯Ό μœ„ν•΄ MySQL μ„œλ²„λŠ” mysql DB의 password_history ν…Œμ΄λΈ”μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

 

PASSWORD REUSE INTERVAL

ν•œ 번 μ‚¬μš©ν–ˆλ˜ λΉ„λ°€λ²ˆν˜Έμ˜ μž¬μ‚¬μš© κΈˆμ§€ 기간을 μ„€μ •ν•˜λŠ” μ˜΅μ…˜μ΄λ©°, λ³„λ„λ‘œ λͺ…μ‹œν•˜μ§€ μ•ŠμœΌλ©΄ password_reuse_interval μ‹œμŠ€ν…œ λ³€μˆ˜μ— μ €μž₯된 κΈ°κ°„μœΌλ‘œ μ„€μ •λ©λ‹ˆλ‹€. PASSWORD REUSE INTERVAL μ ˆμ— μ„€μ • κ°€λŠ₯ν•œ μ˜΅μ…˜μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • PASSWORD REUSE INTERYAL DEFAULT: password_reuse_interval λ³€μˆ˜μ— μ €μž₯된 κΈ°κ°„μœΌλ‘œ μ„€μ •
  • PASSWORD REUSE INTERVAL n DAY: n일 이후에 λΉ„λ°€λ²ˆν˜Έλ₯Ό μž¬μ‚¬μš©ν•  수 있게 μ„€μ •

 

PASSWORD REQUIRE

λΉ„λ°€λ²ˆν˜Έ 반료 ν›„ λ³€κ²½ μ‹œ, 이전 λΉ„λ°€λ²ˆν˜Έμ˜ μž…λ ₯ μ—¬λΆ€λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€. λ³„λ„λ‘œ λͺ…μ‹œλ˜μ§€ μ•ŠμœΌλ©΄ password_require_current μ‹œμŠ€ν…œ λ³€μˆ˜μ˜ κ°’μœΌλ‘œ μ„€μ •λ©λ‹ˆλ‹€. PASSWORD REQUIRE μ ˆμ— μ‚¬μš© κ°€λŠ₯ν•œ μ˜΅μ…˜μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • PASSWORD REQUIRE CURRENT: λΉ„λ°€λ²ˆν˜Έλ₯Ό λ³€κ²½ν•  λ•Œ ν˜„μž¬ λΉ„λ°€λ²ˆν˜Έλ₯Ό λ¨Όμ € μž…λ ₯ν•˜λ„λ‘ μ„€μ •
  • PASSWORD REQUIRE OPTIONAL: λΉ„λ°€λ²ˆν˜Έλ₯Ό λ³€κ²½ν•  λ•Œ ν˜„μž¬ λΉ„λ°€λ²ˆν˜Έλ₯Ό μž…λ ₯ν•˜μ§€ μ•Šμ•„λ„ λ˜λ„λ‘ μ„€μ •
  • PASSWORD REQUIRE DEFAULT: password_require_current μ‹œμŠ€ν…œ λ³€μˆ˜μ˜ κ°’μœΌλ‘œ μ„€μ •

 

ACCOUNT LOCK / UNLOCK

계정 생성 μ‹œ λ˜λŠ” ALTER USER λͺ…령을 μ‚¬μš©ν•΄ 계정 정보λ₯Ό λ³€κ²½ν•  λ•Œ 계정을 μ‚¬μš©ν•˜μ§€ λͺ»ν•˜κ²Œ μž κΈ€μ§€ μ—¬λΆ€λ₯Ό κ²°μ •ν•©λ‹ˆλ‹€.

  • ACCOUNT LOCK: 계정을 μ‚¬μš©ν•˜μ§€ λͺ»ν•˜κ²Œ 잠금
  • ACCOUNT UNLOCK: 잠긴 계정을 λ‹€μ‹œ μ‚¬μš© κ°€λŠ₯ μƒνƒœλ‘œ 잠금 ν•΄μ œ

 

 

[λΉ„λ°€λ²ˆν˜Έ 관리]

κ³ μˆ˜μ€€ λΉ„λ°€λ²ˆν˜Έ

MySQLμ—μ„œλŠ” λΉ„λ°€λ²ˆν˜Έμ˜ μœ νš¨κΈ°κ°„, μž¬μ‚¬μš© μ œν•œ, λ³΅μž‘μ„± 검증 λ“± λ‹€μ–‘ν•œ λ³΄μ•ˆ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. 특히, μ‚¬μš©μžκ°€ μ˜ˆμƒν•˜κΈ° μ‰¬μš΄ λ‹¨μ–΄λ‚˜ νŒ¨ν„΄μ„ ν¬ν•¨ν•˜λŠ” λΉ„λ°€λ²ˆν˜Έμ˜ μ‚¬μš©μ„ λ°©μ§€ν•˜λŠ” κΈ°λŠ₯이 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ MySQL은 validate_password μ»΄ν¬λ„ŒνŠΈλ₯Ό μ œκ³΅ν•˜λŠ”λ°, 이 μ»΄ν¬λ„ŒνŠΈλŠ” MySQL μ„œλ²„μ— 기본으둜 ν¬ν•¨λ˜μ–΄ 있기 λ•Œλ¬Έμ— λ³„λ„μ˜ 파일 경둜 지정 없이 λ°”λ‘œ μ„€μΉ˜κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

validate_password μ»΄ν¬λ„ŒνŠΈ μ„€μΉ˜

INSTALL COMPONENT 'file://component_validate_password';

μ»΄ν¬λ„ŒνŠΈ μ„€μΉ˜ ν›„ ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ œκ³΅ν•˜λŠ” μ‹œμŠ€ν…œ λ³€μˆ˜λ“€μ„ λ‹€μŒκ³Ό 같은 λͺ…λ Ήμ–΄λ‘œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

SHOW VARIABLES LIKE 'validate_password%';

λΉ„λ°€λ²ˆν˜Έ 정책은 크게 λ‹€μŒ 3가지 μ€‘μ—μ„œ 선택할 수 있으며, 기본값은 MEDIUM으둜 μžλ™ μ„€μ •λ©λ‹ˆλ‹€.

  • LOW: λΉ„λ°€λ²ˆν˜Έμ˜ 길이만 검증
  • MEDIUM: λΉ„λ°€λ²ˆν˜Έ 길이, 숫자, λŒ€μ†Œλ¬Έμž, 특수문자 포함 μ—¬λΆ€ 검증
  • STRONG: MEDIUM으 λͺ¨λ“  검증에 μΆ”κ°€λ‘œ κΈˆμΉ™μ–΄ 포함 여뢀도 검증

validate_password.lengthλŠ” λΉ„λ°€λ²ˆν˜Έμ˜ 길이, validate_password.mixed_case_count와 validate_password.number_count, validate_password.special_char_countλŠ” μˆ«μžμ™€ λŒ€μ†Œλ¬Έμž, 특수문자λ₯Ό 일정 수 이상 ν¬ν•¨ν•˜κ³  μžˆλŠ”μ§€ κ²€μ¦ν•©λ‹ˆλ‹€.

그리고 λ§ˆμ§€λ§‰μœΌλ‘œ κΈˆμΉ™μ–΄λŠ” validate_password.dictionary_file μ‹œμŠ€ν…œ λ³€μˆ˜μ— κΈˆμΉ™μ–΄λ“€μ΄ μ €μž₯된 사전 νŒŒμΌμ„ λ“±λ‘ν•˜λ©΄ λ©λ‹ˆλ‹€.

κΈˆμΉ™μ–΄ νŒŒμΌμ€ λ‹€μŒκ³Ό 같이 κΈˆμΉ™μ–΄λ“€μ„ ν•œ 쀄에 ν•˜λ‚˜μ”© κΈ°λ‘ν•΄μ„œ μ €μž₯ν•œ ν…μŠ€νŠΈ 파일둜 μž‘μ„±ν•˜λ©΄ λ©λ‹ˆλ‹€.

password
123456
admin

κΈˆμΉ™μ–΄ νŒŒμΌμ„ μž‘μ„±ν•œ ν›„, 이λ₯Ό MySQL μ„œλ²„μ— μ μš©ν•˜λ €λ©΄ λ‹€μŒκ³Ό 같이 μ„€μ •ν•˜λ©΄ λ©λ‹ˆλ‹€. 단, 이 κΈ°λŠ₯은 validate_password.policyκ°€ 'STRONG'일 λ•Œλ§Œ μ μš©λ©λ‹ˆλ‹€.

SET GLOBAL validate_password.dictionary_file='/path/to/prohibitive_word.data';
SET GLOBAL validate_password.policy='STRONG';

μ΄λ ‡κ²Œ μ„€μ •ν•˜λ©΄ MySQL은 μ§€μ •λœ κΈˆμΉ™μ–΄λ₯Ό ν¬ν•¨ν•˜λŠ” λΉ„λ°€λ²ˆν˜Έμ˜ μ‚¬μš©μ„ μ œν•œν•˜κ²Œ λ©λ‹ˆλ‹€.

 

이쀑 λΉ„λ°€λ²ˆν˜Έ

MySQL8.0λΆ€ν„°λŠ” κ³„μ •μ˜ λ³΄μ•ˆμ„ λ”μš± κ°•ν™”ν•˜κ³ μž ν•˜λŠ” μ˜λ„λ‘œ λΉ„λ°€λ²ˆν˜Έλ‘œ 2개의 값을 λ™μ‹œμ— μ‚¬μš©ν•  수 μžˆλŠ” κΈ°λŠ₯(DUAL λΉ„λ°€λ²ˆν˜Έ)을 μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€. 이 κΈ°λŠ₯의 핡심은 ν•˜λ‚˜μ˜ 계정에 두 개의 λΉ„λ°€λ²ˆν˜Έλ₯Ό ν• λ‹Ήν•˜λŠ” κ²ƒμ΄μ§€λ§Œ, 이 두 개의 λΉ„λ°€λ²ˆν˜Έ 쀑 ν•˜λ‚˜λ§Œ 맞게 μž…λ ₯해도 둜그인이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

λ°μ΄ν„°λ² μ΄μŠ€λŠ” μ—¬λŸ¬ μ‘μš© ν”„λ‘œκ·Έλž¨ μ„œλ²„λ“€κ³Ό κ³΅μœ λ˜λŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€. 이둜 인해 λ°μ΄ν„°λ² μ΄μŠ€μ˜ 계정 정보λ₯Ό λ³€κ²½ν•˜λŠ” 것은 λ³΅μž‘ν•˜κ²Œ 될 수 μžˆμŠ΅λ‹ˆλ‹€. μ‹€μ œ μ„œλΉ„μŠ€ 운영 μ€‘μ—λŠ” μ€‘μš”ν•œ μ„œλΉ„μŠ€μ— 영ν–₯을 쀄 수 있기 λ•Œλ¬Έμ—  λ°μ΄ν„°λ² μ΄μŠ€ κ³„μ •μ˜ λΉ„λ°€λ²ˆν˜Έ 변경이 거의 λΆˆκ°€λŠ₯에 κ°€κΉμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, λ§Žμ€ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œλŠ” 초기 μ„€μ • 이후 였랜 μ‹œκ°„ λ™μ•ˆ λ™μΌν•œ λΉ„λ°€λ²ˆν˜Έλ₯Ό μ‚¬μš©ν•˜λŠ” κ²½μš°κ°€ ν”ν•œλ°, μ΄λŸ¬ν•œ λ°°κ²½μ—μ„œ DUAL λΉ„λ°€λ²ˆν˜ΈλŠ” 보아 강화와 μœ μ—°ν•œ 과리λ₯Ό λ™μ‹œμ— κ°€λŠ₯ν•˜κ²Œ ν•΄μ£ΌλŠ” ν•΄κ²°μ±…μœΌλ‘œ μ œμ‹œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μ•„λž˜λŠ” μ‚¬μš© μ˜ˆμ‹œμž…λ‹ˆλ‹€.

-- λ¨Όμ €, 'user'의 λΉ„λ°€λ²ˆν˜Έλ₯Ό 'old_password'둜 λ³€κ²½ν•©λ‹ˆλ‹€.
ALTER USER 'user'@'%' IDENTIFIED BY 'old_password';

-- 이제 'old_password'λŠ” κ·ΈλŒ€λ‘œ μœ μ§€ν•˜λ©΄μ„œ 'new_password'λ₯Ό μ£Ό λΉ„λ°€λ²ˆν˜Έλ‘œ μΆ”κ°€ν•©λ‹ˆλ‹€.
ALTER USER 'user'@'%' IDENTIFIED BY 'new_password' RETAIN CURRENT PASSWORD;

μ΄λ ‡κ²Œ μ„€μ •ν•œ ν›„μ—λŠ” 'old_password'와 'new_password' λͺ¨λ‘λ₯Ό μ‚¬μš©ν•˜μ—¬ 둜그인이 κ°€λŠ₯ν•˜κ²Œ λ©λ‹ˆλ‹€.

 

 

[κΆŒν•œ(Privilege)]

MySQL은 κΆŒν•œ 관리λ₯Ό 톡해 λ°μ΄ν„°λ² μ΄μŠ€μ˜ λ³΄μ•ˆμ„ κ°•ν™”ν•˜λ©°, μ‚¬μš©μžλ‚˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ μ ˆν•œ κΆŒν•œλ§Œ λΆ€μ—¬ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€. MySQL 5.7 λ²„μ „κΉŒμ§€λŠ” 주둜 λ‹€μŒ μ£Ό μ’…λ₯˜μ˜ κΆŒν•œμœΌλ‘œ λ‚˜λ‰˜μ–΄ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

  • 객체 κΆŒν•œ: νŠΉμ • λ°μ΄ν„°λ² μ΄μŠ€λ‚˜ ν…Œμ΄λΈ”μ— μ μš©λ˜λŠ” κΆŒν•œ
  • κΈ€λ‘œλ²Œ κΆŒν•œ: MySQL μ„œλ²„ μ „λ°˜μ— μ μš©λ˜λŠ” κΆŒν•œμœΌλ‘œ, λ°μ΄ν„°λ² μ΄μŠ€λ‚˜ ν…Œμ΄λΈ” 외에 λ‹€λ₯Έ μžμ›μ—λ„ 적용

MySQL 8.0 λ²„μ „λΆ€ν„°λŠ” 동적 κΆŒν•œμ΄λΌλŠ” μƒˆλ‘œμš΄ κΆŒν•œμ΄ μΆ”κ°€λ˜λ©΄μ„œ, 이전 λ²„μ „μ˜ κΆŒν•œλ“€μ€ 정적 κΆŒν•œμœΌλ‘œ 뢈리게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 동적 κΆŒν•œμ€ μ„œλ²„μ— ν”ŒλŸ¬κ·ΈμΈμ΄λ‚˜ μ»΄ν¬λ„ŒνŠΈκ°€ μ„€μΉ˜λ  λ•Œ λ™μ μœΌλ‘œ μΆ”κ°€ν•  수 μžˆλŠ” κΆŒν•œμž…λ‹ˆλ‹€.

 

κΈ€λ‘œλ²Œ κΆŒν•œ λΆ€μ—¬ν•˜κΈ°

κΈ€λ‘œλ²Œ κΆŒν•œμ„ λΆ€μ—¬ν•˜λ €λ©΄, μ•„λž˜μ™€ 같은 쿼리λ₯Ό μ‹€ν–‰ν•˜λ©΄ λ©λ‹ˆλ‹€.

GRANT SUPER ON *.* TO 'user'@'%';

κ·ΈλŸ¬λ‚˜, κΈ€λ‘œλ²Œ κΆŒν•œμ„ λΆ€μ—¬ν•˜λ”λΌλ„ νŠΉμ • λ°μ΄ν„°λ² μ΄μŠ€λ‚˜ ν…Œμ΄λΈ”μ— μ ‘κ·Όν•˜λŠ” κΆŒν•œμ€ μžλ™μœΌλ‘œ λΆ€μ—¬λ˜μ§€ μ•ŠκΈ°μ— μœ μ˜ν•΄μ•Ό ν•˜λ©°, κΈ€λ‘œλ²Œ κΆŒν•œμ€ νŠΉμ • λ°μ΄ν„°λ² μ΄μŠ€λ‚˜ ν…Œμ΄λΈ”μ— ν•œμ •λ˜μ–΄ μžˆμ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 항상 '*.*' ν˜•μ‹μœΌλ‘œ μž‘μ„±ν•΄μ•Ό ν•©λ‹ˆλ‹€.

κΆŒν•œμ„ ν™•μΈν•˜λ €λ©΄, ν•΄λ‹Ή 계정에 λŒ€ν•΄ λ‹€μŒκ³Ό 같은 쿼리λ₯Ό μ‹€ν–‰ν•˜μ—¬ λΆ€μ—¬λœ κΆŒν•œ λͺ©λ‘μ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

SHOW GRANTS FOR '계정이름'@'호슀트';

 

κΆŒν•œ λΆ€μ—¬ μ’…λ₯˜

-- λͺ¨λ“  λ°μ΄ν„°λ² μ΄μŠ€μ— λŒ€ν•œ κΆŒν•œ λΆ€μ—¬
GRANT ALL PRIVILEGES ON *.* TO 'user'@'%';

-- νŠΉμ • λ°μ΄ν„°λ² μ΄μŠ€ μ˜€λΈŒμ νŠΈμ— λŒ€ν•΄μ„œλ§Œ κΆŒν•œ λΆ€μ—¬
GRANT ALL PRIVILEGES ON mydb.* TO 'user'@'%';

-- νŠΉμ • λ°μ΄ν„°λ² μ΄μŠ€μ˜ νŠΉμ • ν…Œμ΄λΈ”μ— λŒ€ν•΄μ„œλ§Œ κΆŒν•œ λΆ€μ—¬
GRANT SELECT, INSERT ON mydb.mytable TO 'user'@'%';

λ‹€λ§Œ, ν…Œμ΄λΈ”μ΄λ‚˜ 칼럼 λ‹¨μœ„μ˜ κΆŒν•œμ€ 잘 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ°, 칼럼 λ‹¨μœ„μ˜ κΆŒν•œμ΄ ν•˜λ‚˜λΌλ„ μ„€μ •λ˜λ©΄ λ‚˜λ¨Έμ§€ λͺ¨λ“  ν…Œμ΄λΈ”μ˜ λͺ¨λ“  μΉΌλŸΌμ— λŒ€ν•΄μ„œλ„ κΆŒν•œ 체크λ₯Ό ν•˜κΈ° λ•Œλ¬Έμ— 칼럼 ν•˜λ‚˜μ— λŒ€ν•΄μ„œλ§Œ κΆŒν•œμ„ μ„€μ •ν•˜λ”λΌλ„ 전체적인 μ„±λŠ₯에 영ν–₯을 λ―ΈμΉ  수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

 

 

[μ—­ν• (Role)]

MySQL8.0λΆ€ν„°λŠ” κΆŒν•œ 관리λ₯Ό 보닀 효과적으둜 μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ μ—­ν• (Role) κΈ°λŠ₯이 λ„μž…λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 역할은 μ΄λ¦„λ§ŒμœΌλ‘œλŠ” 계정과 κ΅¬λ³„λ˜μ§€λ§Œ, λ‚΄λΆ€μ μœΌλ‘œλŠ” 계정과 λ™μΌν•˜κ²Œ μž‘λ™ν•©λ‹ˆλ‹€.

μ—­ν•  생성

역할을 μƒμ„±ν•˜κΈ° μœ„ν•΄μ„œλŠ” 'CREATE ROLE' λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

CREATE ROLE role_testdb_read, role_testdb_write;

역할에 κΆŒν•œ λΆ€μ—¬

μƒμ„±λœ 역할에 κΆŒν•œμ„ λΆ€μ—¬ν•˜λ €λ©΄ μ•„λž˜μ™€ 같은 λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

GRANT SELECT ON testdb.* TO role_testdb_read;
GRANT INSERT, UPDATE, DELETE ON testdb.* TO role_testdb_write;

μ‚¬μš©μž 계정 생성

λ‹€μŒμœΌλ‘œ 이 역할을 μ‚¬μš©ν•  계정을 μƒμ„±ν•©λ‹ˆλ‹€.

CREATE USER reader@'%' IDENTIFIED BY '12345678';
CREATE USER writer@'%' IDENTIFIED BY '12345678';

계정에 μ—­ν•  λΆ€μ—¬

μƒμ„±ν•œ 계정에 역할을 λΆ€μ—¬ν•©λ‹ˆλ‹€.

GRANT role_testdb_read TO reader@'%';
GRANT role_testdb_read, role_testdb_write TO writer@'%';

μ—­ν•  ν™œμ„±ν™”

'SELECT current_role();'λ₯Ό μ‚¬μš©ν•˜μ—¬ ν˜„μž¬ ν™œμ„±νšŒλœ 역할을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ΄ˆκΈ°μ—λŠ” 역할이 ν™œμ„±ν™”λ˜μ§€ μ•Šμ€ μƒνƒœμ΄κΈ° λ•Œλ¬Έμ— 'SET ROLE' λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ 역할을 ν™œμ„±ν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€.

SET ROLE 'role_testdb_read';

μ—­ν•  μžλ™ ν™œμ„±ν™”

맀번 역할을 μˆ˜λ™μœΌλ‘œ ν™œμ„±ν™”ν•˜λŠ” 것은 번거둜울 수 μžˆμŠ΅λ‹ˆλ‹€. MySQL은 이λ₯Ό μžλ™ν™”ν•˜κΈ° μœ„ν•œ μ‹œμŠ€ν…œ λ³€μˆ˜λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. λ‹€μŒκ³Ό 같이 activate_all_roles_on_login μ‹œμŠ€ν…œ λ³€μˆ˜κ°€ ON으둜 μ„€μ •λ˜λ©΄ 맀번 SET ROLE λͺ…λ ΉμœΌλ‘œ 역할을 ν™œμ„±ν™”ν•˜μ§€ μ•Šμ•„λ„ 둜그인과 λ™μ‹œμ— λΆ€μ—¬λœ 역할이 μžλ™μœΌλ‘œ ν™œμ„±ν™”λ©λ‹ˆλ‹€.

SET GLOBAL activate_all_roles_on_login=ON;

 

μ—­ν• κ³Ό κ³„μ •μ˜ 관계

이전에 λ§ν–ˆλ“―μ΄, MySQL μ„œλ²„μ—μ„œμ˜ 'μ—­ν• 'κ³Ό 'μ‚¬μš©μž 계정'은 λ§Žμ€ μœ μ‚¬μ μ„ 가지고 있으며, μ‹€μ œλ‘œ MySQL μ„œλ²„ λ‚΄λΆ€μ—μ„œλŠ” λ‘˜μ„ λ™μΌν•œ 객체둜 κ°„μ£Όν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ μ£Όλͺ©μ μ€ μ‚¬μš©μž 계정에 λ‹€λ₯Έ μ‚¬μš©μž 계정이 가진 κΆŒν•œμ„ 효율적으둜 λ³‘ν•©ν•˜κΈ° μœ„ν•¨μž…λ‹ˆλ‹€.

계정(User)

  • 둜그인이 κ°€λŠ₯ν•œ 객체
  • λ°μ΄ν„°λ² μ΄μŠ€μ™€ ν…Œμ΄λΈ”μ— 직접적인 κΆŒν•œμ„ κ°€μ§ˆ 수 μžˆλ‹€.

μ—­ν• (Role)

  • 둜그인이 λΆˆκ°€λŠ₯ν•˜λ‹€.
  • κΆŒν•œμ„ λ¬Άμ–΄μ„œ κ΄€λ¦¬ν•˜λŠ” λ‹¨μœ„μ΄λ‹€.
  • κ³„μ •μ—κ²Œ 뢀여될 수 μžˆλ‹€.

μ‹€μ œλ‘œ μ•„λž˜μ˜ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜λ©΄ MySQL에 μ €μž₯된 계정을 λͺ¨λ‘ μ‘°νšŒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

SELECT user,host,account_locked from mysql.user;

μœ„ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜λ©΄, μ—­ν• κ³Ό 계정이 λͺ¨λ‘ 'user' ν…Œμ΄λΈ”μ—μ„œ κ΄€λ¦¬λ˜κ³  μžˆμŒμ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

계정에 역할을 λΆ€μ—¬ν•˜λŠ” 과정은 근본적으둜 ν•˜λ‚˜μ˜ μ‚¬μš©μžκ°€ 가진 κΆŒν•œμ„ λ‹€λ₯Έ μ‚¬μš©μžμ˜ κΆŒν•œ 집합에 ν†΅ν•©ν•˜λŠ” 것이기 λ•Œλ¬Έμž…λ‹ˆλ‹€. λ•Œλ¬Έμ— 'CREATE ROLE' λͺ…λ Ήμ–΄μ—μ„œ 호슀트 정보가 μƒλž΅λ˜μ–΄ 있으며, μ‹€μ œλ‘œ μ΄λŠ” λͺ¨λ“  호슀트('%')에 λŒ€ν•΄ μ•”μ‹œμ μœΌλ‘œ μ μš©ν•œλ‹€λŠ” μ˜λ―Έκ°€ λ©λ‹ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄, μ™œ 'CREATE ROLE'κ³Ό 'CREATE USER'λ₯Ό ꡬ뢄해야 ν• κΉŒμš”?

λ‹¨μˆœνžˆ λ§ν•˜λ©΄, 'CREATE ROLE'은 계정을 μƒμ„±ν•˜λŠ” 것이 μ•„λ‹ˆλΌ κΆŒν•œμ˜ 집합(μ—­ν• )을 μ •μ˜ν•˜λŠ” λͺ…령이기 λ•Œλ¬Έμž…λ‹ˆλ‹€. 'account_locked' 컬럼이 'Y'둜 μ„€μ •λœ 역할은 둜그인이 λΆˆκ°€λŠ₯ν•˜μ§€λ§Œ, 'CREATE USER'둜 μƒμ„±λœ 계정은 둜그인이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

더 κΉ”λ”ν•˜κ²Œ μ—­ν•  관계λ₯Ό ν™•μΈν•˜λ €λ©΄, λ‹€μŒμ˜ ν…Œμ΄λΈ”μ„ μ°Έμ‘°ν•˜λ©΄ λ©λ‹ˆλ‹€.

  • mysql.default_roles: 각 계정에 λΆ€μ—¬λœ κΈ°λ³Έ 역할을 λ‚˜νƒ€λ‚Έλ‹€.
  • mysql.role_edges: λΆ€μ—¬λœ μ—­ν•  κ°„μ˜ 관계λ₯Ό ν‘œν˜„ν•˜λŠ” κ·Έλž˜ν”„ 정보λ₯Ό μ œκ³΅ν•œλ‹€.

 

 

μ°Έκ³ 

Real MySQL 8.0(1ꢌ)